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: Mon, 13 Jul 2009 21:39:28 +0000

CVSROOT:        /sources/certi
Module name:    certi
Changes by:     Eric NOULARD <erk>      09/07/13 21:39:28

Modified files:
        scripts        : GenerateMessages.py TestMessageSpec.msg 

Log message:
        One step forward the AST is almost done.

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/certi/scripts/GenerateMessages.py?cvsroot=certi&r1=1.1&r2=1.2
http://cvs.savannah.gnu.org/viewcvs/certi/scripts/TestMessageSpec.msg?cvsroot=certi&r1=1.1&r2=1.2

Patches:
Index: GenerateMessages.py
===================================================================
RCS file: /sources/certi/certi/scripts/GenerateMessages.py,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -b -r1.1 -r1.2
--- GenerateMessages.py 13 Jul 2009 19:25:43 -0000      1.1
+++ GenerateMessages.py 13 Jul 2009 21:39:28 -0000      1.2
@@ -148,31 +148,83 @@
 # Message set
 class MessageAST(object):
     def __init__(self,name):
+        self.name = name
+        self.nativeMessageType = set()
         self.messageTypeSet = set()
-        self.enumSet        = set()
+        self.enumTypeSet       = set()
+        
+    def add(self,any):
+        if any == None:
+            print "<None> given to AST some rule aren't finished"
+        elif isinstance(any,type("")):
+            pass
+        else:         
+            if isinstance(any,EnumType):            
+                self.addEnumType(any)                            
+            elif isinstance(any,NativeMessageType):
+                self.addNativeMessageType(any)
+            elif isinstance(any,MessageType):
+                self.addMessageType(any)
+            else:            
+                print "<%s> not handle [yet]" % any
+            print "%s added to AST" % any
         
     def addMessageType(self,message):
         self.messageTypeSet.add(message)
         
     def addEnumType(self,enumType):
-        self.enumSet.add(enumType)
+        self.enumTypeSet.add(enumType)
+    
+    def addNativeMessageType(self,message):
+        self.messageTypeSet.add(message)
+        
+class NativeMessageType(object):
+    """ Represents a native message type
+    """
+    def __init__(self,name):
+        self.name = name      
+        
+    def __repr__(self):
+        return "native_message %s" % self.name 
                     
 class MessageType(object):
     """ Represents a message type
     """
-    def __init__(self,name):
+    def __init__(self,name,field_list,merge):
         self.name = name
+        self.field_list = field_list
+        self.merge      = merge
         
     def addField(self,name,type,defaultValue=None):
         self.field[name] = [type,defaultValue]
                 
+    def __repr__(self):
+        res = "message %s " % self.name
+        return res
 
 class EnumType(object):
     """ Represents an enum type 
     """
-    def __init__(self,name):
+    def __init__(self,name,values):
         self.name   = name
-        self.values = list()
+        # rebuild dictionary with value from the list                     
+        self.values = []
+        lastval = -1        
+        for val in values:                                    
+            if (val[1]==None):
+                self.values.append((val[0],lastval+1))
+                lastval += 1
+            else:
+                self.values.append(val)                           
+                lastval = val[1]
+        
+    def __repr__(self):
+        res = "Enum %s {\n" % self.name
+        for val in self.values:            
+            res = res + "  " + str(val[0]) + "=" + str(val[1]) + ", \n"
+        res = res + "}"
+        return res 
+                
         
     def addValue(self,value):
         self.values.append(value)
@@ -186,26 +238,37 @@
                  | native_message statement  
                  | enum
                  | enum statement'''                        
-    print "statement"
+        
+    p.parser.AST.add(p[1])                            
         
 def p_comment_line(p):
     '''comment_line : COMMENT'''
-    print "comment line =",p[1]
+    p[0]=p[1].strip('/')    
             
 def p_message(p):
     '''message : MESSAGE ID LBRACE optional_comment field_list RBRACE 
optional_comment
                | MESSAGE ID LBRACE optional_comment RBRACE optional_comment
                | MESSAGE ID COLON MERGE ID LBRACE  optional_comment RBRACE 
optional_comment
                | MESSAGE ID COLON MERGE ID LBRACE optional_comment field_list 
RBRACE optional_comment'''                                
-    print "message =",p[1],p[2],p[3],p[4]
+    if len(p)==7:        
+        p[0] = MessageType(p[2],[],None)
+    elif len(p)==8:
+        p[0] = MessageType(p[2],p[5],None)
+    elif len(p)==9:
+        p[0] = MessageType(p[2],[],p[5])
+    elif len(p)==10:
+        p[0] = MessageType(p[2],p[7],p[5])                                    
 
 def p_native_message(p): 
     'native_message : NATIVE_MESSAGE ID optional_comment'
-    print "native_message = ", p[1],p[2],p[3] 
+    p[0]=NativeMessageType(p[2])    
         
 def p_enum(p):
-    'enum : ENUM ID LBRACE optional_comment enum_list RBRACE optional_comment'
-    print p[0]
+    'enum : ENUM ID LBRACE optional_comment enum_value_list RBRACE 
optional_comment'
+    # we should reverse the enum value list
+    # because the parse build it the other way around (recursive way)
+    p[5].reverse()
+    p[0] = EnumType(p[2],p[5])
     
 def p_empty(p):
     'empty :'
@@ -214,34 +277,54 @@
 def p_optional_comment(p):
     '''optional_comment : COMMENT 
                         | empty'''
-    print "Comment = %s" % p[1]    
+    # we may store the comment text for future use
+    if len(p) > 1 and isinstance(p[1],type("")) :
+        p[0] = p[1].strip('/')
+    else:
+        p[0] = ""         
     
-def p_enum_list(p):
-    '''enum_list : enum_val optional_comment  
+def p_enum_value_list(p):
+    '''enum_value_list : enum_val optional_comment  
                  | enum_val COMMA optional_comment
-                 | enum_val COMMA optional_comment enum_list'''
-    print p
+                       | enum_val COMMA optional_comment enum_value_list'''
+    # Create or append the list (of pair)            
+    if len(p) > 4:        
+        p[4].append(p[1])
+        p[0]=p[4]
+    else:
+        p[0]=[p[1]]    
     
 def p_enum_val(p):
     '''enum_val : ID 
                 | ID EQUAL INTEGER_VALUE'''
-    print p
+    # Build a pair (ID,value)
+    # value may be None    
+    if len(p)>3:
+        p[0] = (p[1],p[3])
+    else:
+        p[0] = (p[1],None)     
 
 def p_field_list(p):
     '''field_list : field_spec optional_comment
                   | field_spec optional_comment field_list'''
-    print p
+    if len(p)==3:
+        p[0] = [p[1]]
+    else:
+        p[0] = p[3].append(p[1])     
 
 def p_field_spec(p):
     '''field_spec : qualifier typeid ID optional_comment
                   | qualifier typeid ID LBRACKET DEFAULT EQUAL value RBRACKET 
optional_comment'''
-    print p
+    if len(p)==5:
+        p[0] = (p[1],p[2],p[3],None)
+    else:        
+        p[0] = (p[1],p[2],p[3],p[7])   
 
 def p_qualifier(p):
     '''qualifier : REQUIRED
                  | REPEATED
                  | OPTIONAL'''
-    print p
+    p[0] = p[1]
     
 def p_typeid(p):
     '''typeid : BOOL_T
@@ -258,18 +341,17 @@
               | FLOAT_T
               | DOUBLE_T
               | ID'''
-    print p
+    p[0] = p[1]    
     
 def p_value(p):
     '''value : INTEGER_VALUE 
              | FLOAT_VALUE 
              | BOOL_VALUE'''
-    print p   
+    p[0]=p[1].value
     
 def p_error(p):     
     print "Syntax error at '%s' on line %d (token type is '%s')" % 
(p.value,p.lineno,p.type)    
     
-     
 # Build the PLY parser
 parser = ply.yacc.yacc() 
 
@@ -290,9 +372,10 @@
 print "Trying to parse..."    
 msgFile =  open(messagefile,'r')
 lexer.lineno = 1
-parser.parse(msgFile.read(),lexer=lexer)
+parser.AST = MessageAST(messagefile)
+ast = parser.parse(msgFile.read(),lexer=lexer)
 msgFile.close()
-print "Parse succeeded"    
+print "Parse succeeded AST = %s" % ast
 
 sys.exit()
 for l in msgFile:

Index: TestMessageSpec.msg
===================================================================
RCS file: /sources/certi/certi/scripts/TestMessageSpec.msg,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -b -r1.1 -r1.2
--- TestMessageSpec.msg 13 Jul 2009 19:25:43 -0000      1.1
+++ TestMessageSpec.msg 13 Jul 2009 21:39:28 -0000      1.2
@@ -1,6 +1,13 @@
 
 // CERTI message description spec test file
 
+enum MessageType {
+   FIRST_VAL = 0,
+   REAL_VAL1,
+   REAL_VAL2,
+   UNUSED
+}
+
 message MyMessage {}
 
 // blah
@@ -9,8 +16,9 @@
 native_message ANotherativeMessageType 
 
 message MyMessage { // another comment
+    repeated int32 whatever
 }
 
 message MyOtherMessage : merge MyMessage {
-       required bool constrained [default=false]
+       required bool constrained
 }
\ No newline at end of file




reply via email to

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