certi-cvs
[Top][All Lists]
Advanced

[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




reply via email to

[Prev in Thread] Current Thread [Next in Thread]