[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[certi-cvs] certi/scripts GenerateMessages.py TestMessageSp...
From: |
certi-cvs |
Subject: |
[certi-cvs] certi/scripts GenerateMessages.py TestMessageSp... |
Date: |
Tue, 14 Jul 2009 20:23:42 +0000 |
CVSROOT: /sources/certi
Module name: certi
Changes by: Eric NOULARD <erk> 09/07/14 20:23:42
Modified files:
scripts : GenerateMessages.py TestMessageSpec.msg
Log message:
Now AST processing should be good.
Text Generator works.
Next steps are:
- C++ generator
- Java generator
- Python generator
CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/certi/scripts/GenerateMessages.py?cvsroot=certi&r1=1.5&r2=1.6
http://cvs.savannah.gnu.org/viewcvs/certi/scripts/TestMessageSpec.msg?cvsroot=certi&r1=1.4&r2=1.5
Patches:
Index: GenerateMessages.py
===================================================================
RCS file: /sources/certi/certi/scripts/GenerateMessages.py,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -b -r1.5 -r1.6
--- GenerateMessages.py 14 Jul 2009 17:55:22 -0000 1.5
+++ GenerateMessages.py 14 Jul 2009 20:23:42 -0000 1.6
@@ -96,6 +96,7 @@
'EQUAL',
'COLON',
'PERIOD',
+ 'NEWLINE',
] + list(reserved.values())
# This is a message of field or name identifier
@@ -148,7 +149,7 @@
t_PERIOD = r'\.'
# Define a rule so we can track line numbers
-def t_newline(t):
+def t_NEWLINE(t):
r'\n'
t.lexer.lineno += 1
@@ -207,8 +208,6 @@
self.__package = None
self.__types = dict()
self.__ultimateElement = None
- self.__penultimateElement = None
- self.__currentComment = None
self.logger = logging.Logger("MessageAST")
self.logger.setLevel(logging.DEBUG)
self.logger.addHandler(stdoutHandler)
@@ -247,21 +246,18 @@
self.addMessageType(any)
elif isinstance(any,Package):
self.package = any
- # Handle multiline comment
+ # Handle comment block preceding other AST element
elif isinstance(any,CommentBlock):
- if isinstance(self.__ultimateElement,CommentBlock):
- # the Comment block continues
- self.__ultimateElement.lines.append(any.lines)
- elif self.__ultimateElement != None:
+ if self.__ultimateElement != None:
# attach the comment block to the preceding
# AST element (recursion is backtracking)
+ # The list of comment line should be reversed
+ any.lines.reverse()
self.__ultimateElement.comment = any
else:
pass
else:
self.logger.error("<%s> not handle [yet]" % any)
- # update ultimate and penultimate AST element
- self.__penultimateElement = self.__ultimateElement
self.__ultimateElement = any
def addMessageType(self,message):
@@ -290,7 +286,7 @@
class CommentBlock(ASTElement):
def __init__(self,content,optComment):
- super(CommentBlock,self).__init__(name="comment")
+ super(CommentBlock,self).__init__(name="ANY Comment Block")
self.lines=[content]
self.__optComment=optComment
@@ -324,7 +320,7 @@
return res
- def hasMerger(self):
+ def hasMerge(self):
return self.merge != None
class MessageField(ASTElement):
@@ -376,16 +372,21 @@
p.parser.AST.add(p[1])
def p_statement(p):
- '''statement : comment_line
+ '''statement : comment_block
| package
| message
| native_message
| enum'''
p[0]=p[1]
-def p_comment_line(p):
- '''comment_line : COMMENT'''
+def p_comment_block(p):
+ '''comment_block : COMMENT
+ | COMMENT comment_block'''
+ if len(p)==2:
p[0]=CommentBlock(p[1].strip('/'),optComment=False)
+ else:
+ p[0]=p[2]
+ p[0].lines.append(p[1].strip('/'))
def p_package(p):
'''package : PACKAGE package_id'''
@@ -400,25 +401,27 @@
p[0]=p[1]+"."+p[3]
def p_message(p):
- '''message : MESSAGE ID LBRACE RBRACE optional_comment
- | MESSAGE ID LBRACE field_list RBRACE optional_comment
- | MESSAGE ID COLON MERGE ID LBRACE RBRACE optional_comment
- | MESSAGE ID COLON MERGE ID LBRACE field_list RBRACE
optional_comment'''
- if len(p)==6:
+ '''message : MESSAGE ID LBRACE RBRACE
+ | MESSAGE ID LBRACE field_list RBRACE
+ | MESSAGE ID COLON MERGE ID LBRACE RBRACE
+ | MESSAGE ID COLON MERGE ID LBRACE field_list RBRACE'''
+ if len(p)==5:
p[0] = MessageType(p[2],[],None)
- elif len(p)==7:
+ elif len(p)==6:
+ p[4].reverse()
p[0] = MessageType(p[2],p[4],None)
elif len(p)==8:
- p[0] = MessageType(p[2],[],p[4])
+ p[0] = MessageType(p[2],[],p[5])
elif len(p)==9:
- p[0] = MessageType(p[2],p[7],p[4])
+ p[7].reverse()
+ p[0] = MessageType(p[2],p[7],p[5])
def p_native_message(p):
'native_message : NATIVE_MESSAGE ID'
p[0]=NativeMessageType(p[2])
def p_enum(p):
- 'enum : ENUM ID LBRACE enum_value_list RBRACE optional_comment'
+ 'enum : ENUM ID LBRACE enum_value_list RBRACE'
# we should reverse the enum value list
# because the parse build it the other way around (recursive way)
p[4].reverse()
@@ -537,39 +540,51 @@
def __init__(self,MessageAST):
self.AST = MessageAST
- def writeMultiLineComment(self,stream,ASTElement):
+ def writeComment(self,stream,ASTElement):
if ASTElement.hasComment():
for line in ASTElement.comment.lines:
stream.write("// ")
stream.write(str(line))
stream.write("\n")
+ else:
+ stream.write("\n")
def generate(self,stream):
# Generate package
if self.AST.hasPackage():
- self.writeMultiLineComment(stream, self.AST.package)
- stream.write("package %s" % self.AST.package.name)
+ self.writeComment(stream, self.AST.package)
+ stream.write("package %s\n" % self.AST.package.name)
# Generate enum
for enum in self.AST.enums:
- self.writeMultiLineComment(stream, enum)
+ self.writeComment(stream, enum)
stream.write("enum %s {\n" % enum.name)
+ first = True
for enumval in enum.values:
- stream.write(" %s,\n" % enumval.name)
+ if first:
+ stream.write(" %s = %d, " %
(enumval.name,enumval.value))
+ first=False
+ else:
+ stream.write(" %s, " % enumval.name)
+ self.writeComment(stream, enumval)
stream.write("}\n")
# Generate native message
for native in self.AST.nativeMessages:
- self.writeMultiLineComment(stream, native)
+ self.writeComment(stream, native)
stream.write("native_message %s\n" % native.name)
# Generate message type
for msg in self.AST.messages:
- self.writeMultiLineComment(stream, msg)
- stream.write("message %s {\n"%msg.name)
+ self.writeComment(stream, msg)
+ stream.write("message %s"%msg.name)
+ if msg.hasMerge():
+ stream.write(" : merge %s {\n" % msg.merge)
+ else:
+ stream.write(" {\n")
+
for field in msg.field_list:
- stream.write(" %s %s %s" %
(field.qualifier,field.typeid,field.name))
+ stream.write(" %s %s %s " %
(field.qualifier,field.typeid,field.name))
if field.hasDefaultValue():
- stream.write("= %s\n" % field.defaultValue)
- else:
- stream.write("\n")
+ stream.write("[default=%s] " % field.defaultValue)
+ self.writeComment(stream, field)
stream.write("}\n")
# Build the PLY parser
Index: TestMessageSpec.msg
===================================================================
RCS file: /sources/certi/certi/scripts/TestMessageSpec.msg,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -b -r1.4 -r1.5
--- TestMessageSpec.msg 14 Jul 2009 17:18:24 -0000 1.4
+++ TestMessageSpec.msg 14 Jul 2009 20:23:42 -0000 1.5
@@ -1,11 +1,13 @@
+//
// CERTI message description spec test file
-// another line
+//
package my.hierarchy.pack
//
// This is a multiline
// comment
//
+
enum EType {
FIRST_VAL = 0, // one may specify the value of the first enum symbol
REAL_VAL1 ,
@@ -20,12 +22,12 @@
native_message ANotherativeMessageType
-message MyMessage {
+message MyMessage2 {
repeated int32 whatever
}
message MyOtherMessage : merge MyMessage {
- required bool constrained
+ required bool constrained // constrain
required MessageType type
required uint32 a [ default=1 ]
}
\ No newline at end of file