certi-cvs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[certi-cvs] certi/scripts GenerateMessages.py CERTI_Network...


From: certi-cvs
Subject: [certi-cvs] certi/scripts GenerateMessages.py CERTI_Network...
Date: Sat, 05 Sep 2009 18:38:57 +0000

CVSROOT:        /sources/certi
Module name:    certi
Changes by:     Eric NOULARD <erk>      09/09/05 18:38:56

Modified files:
        scripts        : GenerateMessages.py CERTI_NetworkMessage.msg 

Log message:
        Small fix for handling default value of bool
        C++ Header generation seems ok.
        Going on with body.

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/certi/scripts/GenerateMessages.py?cvsroot=certi&r1=1.14&r2=1.15
http://cvs.savannah.gnu.org/viewcvs/certi/scripts/CERTI_NetworkMessage.msg?cvsroot=certi&r1=1.2&r2=1.3

Patches:
Index: GenerateMessages.py
===================================================================
RCS file: /sources/certi/certi/scripts/GenerateMessages.py,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -b -r1.14 -r1.15
--- GenerateMessages.py 18 Aug 2009 13:54:54 -0000      1.14
+++ GenerateMessages.py 5 Sep 2009 18:38:56 -0000       1.15
@@ -19,7 +19,7 @@
 ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
 ## USA
 ##
-## $Id: GenerateMessages.py,v 1.14 2009/08/18 13:54:54 erk Exp $
+## $Id: GenerateMessages.py,v 1.15 2009/09/05 18:38:56 erk Exp $
 ## ----------------------------------------------------------------------------
 
 """
@@ -33,6 +33,8 @@
 # PLY is there: http://www.dabeaz.com/ply/
 import ply.yacc
 import ply.lex
+# We need some regular expression handling 
+import re
 # We use logging for ... logging :-)
 # see http://docs.python.org/library/logging.html
 import logging 
@@ -49,7 +51,7 @@
 mainlogger.addHandler(stdoutHandler)
 
 def usage():
-    print "Usage:\n %s --input=<message> [--language=C++|Java|Python|Text] 
[--type=header|body] [--factory-only] [--output=<filename>] [--verbose] 
[--help]" % os.path.basename(sys.argv[0])
+    print "Usage:\n %s --input=<message> [--language=C++|Java|Python|MsgSpec] 
[--type=header|body] [--factory-only] [--output=<filename>] [--verbose] 
[--help]" % os.path.basename(sys.argv[0])
     
 try:
     opts, args = getopt.getopt(sys.argv[1:], "i:l:t:o:vh", 
["input=","language=","type=","factory-only","output=","verbose","help"])
@@ -66,7 +68,7 @@
 verbose=False
 factoryOnly=False
 gentype="header"
-language="Text"
+language="MsgSpec"
 output=sys.stdout
 
 # Parse command line options
@@ -89,7 +91,7 @@
         sys.exit(0)
 
 mainlogger.info("Reading message specifications from: <%s>" % inputFile)       
-mainlogger.info("output send to: <%s>" % repr(output))
+mainlogger.info("output send to: <%s>" % repr(output.name))
 mainlogger.info("Generating for language: <%s>" % language)
 
 # Lexer+Parser specification begins here
@@ -142,6 +144,9 @@
 # This is a message of field or name identifier          
 def t_ID(t):
     r'[a-zA-Z_][a-zA-Z_0-9]*'
+    if re.match( 
"^true$|^false$|^True$|^False$|^On$|^on$|^Off$|^off$",t.value):
+        t.type = 'BOOL_VALUE'
+    else:
     t.type = reserved.get(t.value,'ID') # Check for reserved words
     return t
 
@@ -697,13 +702,16 @@
 def p_field_spec(p):
     '''field_spec : qualifier typeid ID eol_comment
                   | qualifier typeid ID LBRACKET DEFAULT EQUAL value RBRACKET 
eol_comment'''
+    
     if len(p)==5:
+        print p[0],p[1],p[2],p[3]
         p[0] = MessageType.MessageField(p[1],p[2],p[3],None)
         p[0].comment = p[4]
         p[0].linespan = (p.linespan(1)[0],p.linespan(4)[1])
     else:        
+        print p[0],p[1],p[2],p[3],p[4],p[5],p[6],p[7],p[8],p[9]
         p[0] = MessageType.MessageField(p[1],p[2],p[3],p[7])
-        p[0].comment = p[8]   
+        p[0].comment = p[9]   
         p[0].linespan = (p.linespan(1)[0],p.linespan(8)[1])
 
 def p_qualifier(p):
@@ -869,6 +877,12 @@
              i -= 1
         return res
     
+    def getTargetTypeName(self,name):
+        if name in self.builtinTypeMap.keys():
+            return self.builtinTypeMap[name]
+        else:
+            return name
+    
     def lowerFirst(self,str):
         res = str[0].lower()+str[1:]
         return res
@@ -919,7 +933,7 @@
         else:
             self.logger.error("What <%s> unknown type??"%what)
     
-class TextGenerator(CodeGenerator):
+class MsgSpecGenerator(CodeGenerator):
     """
     This is a text generator for C{MessageAST}.
     
@@ -927,8 +941,8 @@
     as the input message specification file. 
     """
     def __init__(self,MessageAST):
-        super(TextGenerator,self).__init__(MessageAST,"//")
-        self.logger = logging.Logger("TextGenerator")
+        super(MsgSpecGenerator,self).__init__(MessageAST,"//")
+        self.logger = logging.Logger("MsgSpecGenerator")
         self.logger.setLevel(logging.ERROR)
         self.logger.addHandler(stdoutHandler)            
                         
@@ -987,7 +1001,7 @@
             stream.write("factory %s {\n" % self.AST.factory.name)
             self.indent()
             stream.write(self.getIndent()+"factoryCreator %s %s(%s)\n"% 
self.AST.factory.creator)
-            stream.write(self.getIndent()+"factoryReceiver %s %s(%s)\n"% 
self.AST.factory.creator)
+            stream.write(self.getIndent()+"factoryReceiver %s %s(%s)\n"% 
self.AST.factory.receiver)
             self.unIndent()
             stream.write("}\n\n")
             
@@ -1036,10 +1050,9 @@
                 stream.write(self.getIndent()+"} "+self.commentLineBeginWith+" 
end of namespace %s \n" % ns)
                 
     def writeOneGetterSetter(self,stream,field):
-        if field.typeid.name in self.builtinTypeMap.keys():
-            targetTypeName = self.builtinTypeMap[field.typeid.name]
-        else:
-            targetTypeName = field.typeid.name
+        
+        targetTypeName = self.getTargetTypeName(field.typeid.name)
+        
         if field.typeid.name == "onoff":
             stream.write(self.getIndent())
             stream.write("void "+field.name+"On()")
@@ -1141,7 +1154,7 @@
                 self.indent()
                 for field in msg.fields:
                     stream.write(self.getIndent())                
-                    stream.write("%s %s;" % (field.typeid.name,field.name))    
                                    
+                    stream.write("%s %s;" % 
(self.getTargetTypeName(field.typeid.name),field.name))                         
               
                     self.writeComment(stream, field)
                 self.unIndent()
                 # end protected  
@@ -1158,7 +1171,28 @@
         # Generate Factory (if any)
         # @todo
         if self.AST.hasFactory():
-            pass
+            self.writeComment(stream, self.AST.factory)
+            stream.write(self.getIndent() + "class CERTI_EXPORT %s {\n" % 
self.AST.factory.name)
+            self.indent()
+            # begin public
+            stream.write(self.getIndent()+"public:\n")            
+            self.indent()            
+            stream.write(self.getIndent()+"static %s* %s(%s) throw 
(RTIinternalError);\n"% self.AST.factory.creator)
+            stream.write(self.getIndent()+"static %s* %s(%s) throw 
(RTIinternalError);\n"% self.AST.factory.receiver)
+            self.unIndent()
+            #end public
+            #begin protected
+            stream.write(self.getIndent()+"protected:\n")
+            self.indent()
+            self.unIndent()
+            #end protected
+            #begin private
+            stream.write(self.getIndent()+"private:\n")
+            self.indent()
+            self.unIndent()
+            #end private
+            self.unIndent()
+            stream.write(self.getIndent()+"}\n\n")            
                         
         # may close any open namespaces 
         self.closeNamespaces(stream)
@@ -1166,6 +1200,95 @@
         stream.write(self.commentLineBeginWith+" %s\n"%headerProtectMacroName)
         stream.write("#endif\n")
 
+    def writeInitFieldStatement(self,stream,field):
+        pass
+        
+    def generateBody(self,stream,factoryOnly=False):
+        """
+        Generate the body.
+        """
+        # Generate namespace for specified package package 
+        # we may have nested namespace
+        self.openNamespaces(stream)
+        if not factoryOnly:                        
+            # Generate message type
+            for msg in self.AST.messages:
+                self.writeComment(stream, msg)                            
+                # Generate Constructor                
+                stream.write(self.getIndent()+"%s::%s() {\n" % 
(msg.name,msg.name))            
+                self.indent()
+                # Write init value if any was provided
+                if len(msg.fields)>0:
+                    for field in msg.fields:
+                        self.writeInitFieldStatement(stream,field)             
           
+                self.unIndent()
+                stream.write(self.getIndent()+"}\n")
+                # Generate Destructor                
+                stream.write(self.getIndent()+"%s::~%s() {\n" % 
(msg.name,msg.name))            
+                self.indent()
+                self.unIndent()
+                stream.write(self.getIndent()+"}\n")
+                                
+                # write virtual serialize and deserialize
+                # if we have some specific field
+                if len(msg.fields)>0:
+                    # serialize/deserialize 
+                    stream.write(self.getIndent()+"virtual void 
serialize(MessageBuffer& msgBuffer);\n")
+                    stream.write(self.getIndent()+"virtual void 
deserialize(MessageBuffer& msgBuffer);\n")
+                    # specific getter/setter
+                    stream.write(self.getIndent()+self.commentLineBeginWith+" 
specific Getter(s)/Setter(s)\n")
+                    for field in msg.fields:
+                        self.writeOneGetterSetter(stream,field)
+                                
+                self.unIndent()
+                # end public:
+                
+                # begin protected
+                stream.write(self.getIndent()+"protected:\n")
+                self.indent()
+                for field in msg.fields:
+                    stream.write(self.getIndent())                
+                    stream.write("%s %s;" % 
(self.getTargetTypeName(field.typeid.name),field.name))                         
               
+                    self.writeComment(stream, field)
+                self.unIndent()
+                # end protected  
+                
+                # begin private
+                stream.write(self.getIndent()+"private:\n")
+                self.indent()
+                self.unIndent()
+                # end private
+                
+                self.unIndent()
+                stream.write(self.getIndent() + "}\n")
+
+        # Generate Factory (if any)
+        # @todo
+        if self.AST.hasFactory():             
+            self.writeComment(stream, self.AST.factory)
+            stream.write(self.getIndent() + "class CERTI_EXPORT %s {\n" % 
self.AST.factory.name)
+            self.indent()
+            # begin public
+            stream.write(self.getIndent()+"public:\n")            
+            self.indent()            
+            stream.write(self.getIndent()+"static %s* %s(%s) throw 
(RTIinternalError);\n"% self.AST.factory.creator)
+            stream.write(self.getIndent()+"static %s* %s(%s) throw 
(RTIinternalError);\n"% self.AST.factory.receiver)
+            self.unIndent()
+            #end public
+            #begin protected
+            stream.write(self.getIndent()+"protected:\n")
+            self.indent()
+            self.unIndent()
+            #end protected
+            #begin private
+            stream.write(self.getIndent()+"private:\n")
+            self.indent()
+            self.unIndent()
+            #end private
+            self.unIndent()
+            stream.write(self.getIndent()+"}\n\n")
+        self.closeNamespaces(stream)                        
+
 class JavaGenerator(CodeGenerator):
     """
     This is a Java generator for C{MessageAST}.
@@ -1204,7 +1327,6 @@
         self.logger.addHandler(stdoutHandler)
         # Message builtin type to Java type
                                                 
-                     
 # Build the PLY parser
 parserlogger = logging.Logger("MessageParser")
 parserlogger.setLevel(logging.ERROR)
@@ -1233,23 +1355,22 @@
     sys.exit()
 
 mainlogger.info("Generate %s from AST,..."%language)
-if language.lower()=="text":    
-    textGen = TextGenerator(parser.AST)
-    textGen.generate(output,gentype,factoryOnly)    
+generator = None
+if language.lower()=="msgspec":    
+    generator = MsgSpecGenerator(parser.AST)    
 elif language.lower()=="c++":
-    cxxGen = CXXGenerator(parser.AST)
-    cxxGen.generate(output,gentype,factoryOnly)
+    generator = CXXGenerator(parser.AST)    
 elif language.lower()=="java":
-    javaGen = JavaGenerator(parser.AST)
-    javaGen.generate(output,gentype,factoryOnly)
+    generator = JavaGenerator(parser.AST)
 elif language.lower()=="python":
-    pythonGen = PythonGenerator(parser.AST)
-    pythonGen.generate(output,gentype,factoryOnly)
+    generator= PythonGenerator(parser.AST)    
 elif language.lower()=="none":
     mainlogger.info("Nothing to generate for <%s>." % language)
 else:
     mainlogger.error("Language <%s> is unknown" % language)
 
+if generator != None:
+    generator.generate(output,gentype,factoryOnly) 
 mainlogger.info("Generate %s from AST, Done." % language)
 
 sys.exit()

Index: CERTI_NetworkMessage.msg
===================================================================
RCS file: /sources/certi/certi/scripts/CERTI_NetworkMessage.msg,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -b -r1.2 -r1.3
--- CERTI_NetworkMessage.msg    17 Jul 2009 00:22:05 -0000      1.2
+++ CERTI_NetworkMessage.msg    5 Sep 2009 18:38:56 -0000       1.3
@@ -51,7 +51,7 @@
 }
 
 message NM_DDM_Base : merge  NM_WithHandleArray {
-       required bool DDM_bool
+       required bool DDM_bool [ default=false ]
 }
 
 message NM_Close_Connexion : merge NetworkMessage {}




reply via email to

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