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: Fri, 17 Jul 2009 00:22:05 +0000

CVSROOT:        /sources/certi
Module name:    certi
Changes by:     Eric NOULARD <erk>      09/07/17 00:22:05

Modified files:
        scripts        : GenerateMessages.py CERTI_NetworkMessage.msg 

Log message:
        Add Factory support in the message language

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/certi/scripts/GenerateMessages.py?cvsroot=certi&r1=1.10&r2=1.11
http://cvs.savannah.gnu.org/viewcvs/certi/scripts/CERTI_NetworkMessage.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.10
retrieving revision 1.11
diff -u -b -r1.10 -r1.11
--- GenerateMessages.py 16 Jul 2009 13:13:15 -0000      1.10
+++ GenerateMessages.py 17 Jul 2009 00:22:05 -0000      1.11
@@ -19,7 +19,7 @@
 ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
 ## USA
 ##
-## $Id: GenerateMessages.py,v 1.10 2009/07/16 13:13:15 erk Exp $
+## $Id: GenerateMessages.py,v 1.11 2009/07/17 00:22:05 erk Exp $
 ## ----------------------------------------------------------------------------
 
 """
@@ -93,14 +93,18 @@
 # reserved keywords
 reserved = {
    'package'        : 'PACKAGE',
+   'factory'        : 'FACTORY',
+   'factoryCreator' : 'FACTORY_CREATOR',
+   'factoryReceiver': 'FACTORY_RECEIVER',   
    'native' : 'NATIVE',            
    'message' : 'MESSAGE',
    'merge' : 'MERGE',
    'enum' : 'ENUM',
    'default' : 'DEFAULT',
    'required' : 'REQUIRED',
-   'optional': 'OPTIONAL',
-   'repeated': 'REPEATED',
+   'optional' : 'OPTIONAL',
+   'repeated' : 'REPEATED',
+   'onoff'    : 'ONOFF_T',
    'bool' : 'BOOL_T',
    'string' : 'STRING_T',
    'byte' : 'BYTE_T',
@@ -123,6 +127,7 @@
           'FLOAT_VALUE',
           'BOOL_VALUE',          
           'RBRACE','LBRACE',
+          'RPAREN','LPAREN',
           'RBRACKET','LBRACKET',
           'COMMA',
           'EQUAL',
@@ -161,10 +166,10 @@
     return t
 
 def t_BOOL_VALUE(t): 
-    r'true|false|True|False'     
-    if (t.value.lower()=="true"):        
+    r'true|false|True|False|On|on|Off|off'     
+    if t.value.lower()=="true" or t.value.lower()=="on":        
         t.value = True
-    elif (t.value.lower()=="false"):
+    elif t.value.lower()=="false" or t.value.lower()=="off" :
         t.value = False
     else:                
         t.lexer.logger.error("Invalid Boolean value too large", t.value) 
@@ -175,6 +180,8 @@
 t_RBRACE = r'}'
 t_LBRACKET = r'\['
 t_RBRACKET = r'\]'
+t_LPAREN = r'\('
+t_RPAREN = r'\)'
 t_COMMA = r','
 t_EQUAL = r'='
 t_COLON = r':'
@@ -269,11 +276,13 @@
     def __init__(self,name):
         super(MessageAST,self).__init__(name=name)
         self.__package            = None        
+        self.__factory            = None
         self.__nativeTypes        = []
         self.__messageTypes       = []
         self.__enumTypes          = []
         # The types dictionary is initialized with builtin types
-        self.__types                = {'bool' : ASTElement("bool"),
+        self.__types                = {'onoff' : ASTElement("onoff"),
+                                       'bool' : ASTElement("bool"),
                                        'string' : ASTElement("string"),
                                        'byte' : ASTElement("byte"),
                                        'int8' : ASTElement("int8"),
@@ -300,6 +309,15 @@
     # pythonic getter/setter using properties   
     package = property(fget=__getPackage,fset=__setPackage,fdel=None,doc=None) 
       
         
+    def hasFactory(self):
+        return self.__factory != None
+    def __getFactory(self):
+        return self.__factory
+    def __setFactory(self,factory):
+        self.__factory = factory
+    # pythonic getter/setter using properties   
+    factory = property(fget=__getFactory,fset=__setFactory,fdel=None,doc=None)
+        
     def __getNativeTypes(self):
         return self.__nativeTypes  
     # pythonic getter/setter using properties   
@@ -343,6 +361,8 @@
                 self.addMessageType(any)
             elif isinstance(any,Package):
                 self.package = any
+            elif isinstance(any,Factory):
+                self.factory = any
             # Handle comment block preceding other AST element
             elif isinstance(any,CommentBlock):                
                 if self.__ultimateElement != None:
@@ -407,6 +427,7 @@
     
     def __repr__(self):
         res = "AST with <%d> native type(s), <%d> enum, <%d> message type(s)" 
% (len(self.natives),len(self.enums),len(self.messages))
+        res = res + " and factory <%s> "% self.factory.name
         res = res + " in package <%s>" % self.package
         return res    
     
@@ -445,6 +466,24 @@
     def __repr__(self):
         return "package %s" % self.name
      
+class Factory(ASTElement):
+    """
+    Represents a factory.
+    
+    A C{Factory} is anC{ASTElement} whose
+    name is a C{string}.
+    """
+    def __init__(self,name,creator,receiver):        
+        super(Factory,self).__init__(name)
+        self.creator  = creator
+        self.receiver = receiver
+          
+    def __repr__(self):
+        res="factory %s" % self.name
+        res=res+ ", creator = %s %s(%s)" % creator
+        res=res+ ", receiver = %s %s(%s)" % receiver
+        return res    
+     
 class NativeType(ASTElement):
     """ 
     Represents a native message type.
@@ -529,6 +568,7 @@
 def p_statement(p):
     '''statement : comment_block
                  | package                 
+                 | factory
                  | message                 
                  | native                 
                  | enum'''        
@@ -556,6 +596,18 @@
     else:
         p[0]=p[1]+"."+p[3]
             
+def p_factory(p):
+    '''factory : FACTORY ID LBRACE factory_creator factory_receiver RBRACE'''
+    p[0] = Factory(p[2],p[4],p[5])
+
+def p_factory_creator(p):
+    '''factory_creator : FACTORY_CREATOR ID ID LPAREN ID RPAREN'''
+    p[0]=(p[2],p[3],p[5])
+
+def p_factory_receiver(p):
+    '''factory_receiver : FACTORY_RECEIVER ID ID LPAREN ID RPAREN'''
+    p[0]=(p[2],p[3],p[5])
+            
 def p_message(p):
     '''message : MESSAGE ID LBRACE RBRACE 
                | MESSAGE ID LBRACE field_list RBRACE 
@@ -656,7 +708,8 @@
     p[0] = p[1]
     
 def p_typeid(p):
-    '''typeid : BOOL_T
+    '''typeid : ONOFF_T
+              | BOOL_T
               | STRING_T
               | BYTE_T
               | INT8_T
@@ -674,10 +727,10 @@
     
 def p_defined_type(p):
     '''defined_type : ID'''
+    # A defined type is either a Message or Native or Enum Type.
     # This kind of type should be checked
-    # When the AST has been built.
-    # We cannot check it now because of the recursive
-    # nature of the parser.
+    # **after* the AST has been built entirely.
+    # We cannot check it now because of the recursive nature of the parser.
     p[0]=p[1]    
     
 def p_value(p):
@@ -743,7 +796,14 @@
                 else:                   
                    f.typeid = AST.getType(f.typeid)
                                 
+        # @todo
+        # Should check if the default value of a field
+        # has the appropriate type (builtin types)
+        # and that field with defined type have NO
+        # default value
+                                
         # check if merger are either native or message
+        # @todo should check that merger is not an enum
         for msg in AST.messages:
             if msg.hasMerge():
                 if not AST.isDefined(msg.merge):
@@ -769,6 +829,20 @@
         self.logger.addHandler(stdoutHandler)
         self.__indentString = "   "
         self.__indentLevel  = 0        
+        self.builtinTypeMap = {'onoff'    : 'onoff',
+                               'bool'     : 'bool',
+                               'string'   : 'string',
+                               'byte'     : 'byte',
+                               'int8'     : 'int8',
+                               'uint8'    : 'uint8',
+                               'int16'    : 'int16',
+                               'uint16'   : 'uint16',
+                               'int32'    : 'int32',
+                               'uint32'   : 'uint32',   
+                               'int64'    : 'int64',
+                               'uint64'   : 'uint64',
+                               'float'    : 'float',
+                               'double'   : 'double',}
         
     def setIndentString(self,indentString):
         self.__indentString = indentString
@@ -870,6 +944,7 @@
             self.writeComment(stream, self.AST.package)
             stream.write("package %s\n\n" % self.AST.package.name)
             
+
         # Generate native type
         for native in self.AST.natives:            
             self.writeComment(stream, native)
@@ -907,6 +982,18 @@
                 self.writeComment(stream, field)                    
             stream.write("}\n\n")        
             
+        # Generate Factory
+        if self.AST.hasFactory():
+            self.writeComment(stream, self.AST.factory)
+            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)
+            self.unIndent()
+            stream.write("}\n\n")
+
+
+            
 class CXXGenerator(CodeGenerator):
     """
     This is a C++ generator for C{MessageAST}.
@@ -917,6 +1004,21 @@
         self.logger = logging.Logger("CXXGenerator")
         self.logger.setLevel(logging.ERROR)
         self.logger.addHandler(stdoutHandler)                    
+        self.builtinTypeMap = {'onoff'    : 'bool',
+                               'bool'     : 'bool',
+                               'string'   : 'std::string',
+                               'byte'     : 'byte',
+                               'int8'     : 'int8_t',
+                               'uint8'    : 'uint8_t',
+                               'int16'    : 'int16_t',
+                               'uint16'   : 'uint16_t',
+                               'int32'    : 'int32_t',
+                               'uint32'   : 'uint32_t',   
+                               'int64'    : 'int64_t',
+                               'uint64'   : 'uint64_t',
+                               'float'    : 'float_t',
+                               'double'   : 'double_t',}
+
         
     def openNamespaces(self,stream):
         if self.AST.hasPackage():
@@ -937,7 +1039,11 @@
                 stream.write(self.getIndent()+"} "+self.commentLineBeginWith+" 
end of namespace %s \n" % ns)
                 
     def writeOneGetterSetter(self,stream,field):
-        if field.typeid.name == "bool":
+        if field.typeid.name in self.builtinTypeMap.keys():
+            targetTypeName = self.builtinTypeMap[field.typeid.name]
+        else:
+            targetTypeName = field.typeid.name
+        if field.typeid.name == "onoff":
             stream.write(self.getIndent())
             stream.write("void "+field.name+"On()")
             stream.write(" {"+field.name+" = true;};\n")
@@ -947,24 +1053,24 @@
             stream.write(" {"+field.name+" = false;};\n")
         
             stream.write(self.getIndent())
-            stream.write("bool get"+self.upperFirst(field.name)+"()")
+            stream.write(targetTypeName+ " 
is"+self.upperFirst(field.name)+"On()")
             stream.write(" {return "+field.name+";};\n")
         else:
             stream.write(self.getIndent())
-            stream.write(field.typeid.name + " 
get"+self.upperFirst(field.name)+"()")
+            stream.write(targetTypeName + " 
get"+self.upperFirst(field.name)+"()")
             stream.write(" {return "+field.name+";};\n")        
             
             stream.write(self.getIndent())
             stream.write("void set"+self.upperFirst(field.name)+"(")
-            stream.write(field.typeid.name+" 
new"+self.upperFirst(field.name)+")")
+            stream.write(targetTypeName+" new"+self.upperFirst(field.name)+")")
             stream.write(" 
{"+field.name+"=new"+self.upperFirst(field.name)+";};\n")        
                                                     
     def generateHeader(self,stream):
         # write the usual header protecting MACRO
         (headerProtectMacroName,ext) = os.path.splitext(self.AST.name)
         headerProtectMacroName = "%s__HH" % headerProtectMacroName.upper()
-        stream.write("#ifndef %s"%headerProtectMacroName)
-        stream.write("#define %s"%headerProtectMacroName)        
+        stream.write("#ifndef %s\n"%headerProtectMacroName)
+        stream.write("#define %s\n"%headerProtectMacroName)        
         # Generate namespace for specified package package 
         # we may have nested namespace
         self.openNamespaces(stream)
@@ -1051,11 +1157,17 @@
             self.unIndent()
             stream.write(self.getIndent() + "}\n")
             
+        # Generate Factory (if any)
+        # @todo
+        if self.AST.hasFactory():
+            pass
+            
+            
         # may close any open namespaces 
         self.closeNamespaces(stream)
         # close usual HEADER protecting MACRO
-        stream.write(self.commentLineBeginWith+"%s\n"%headerProtectMacroName)
-        stream.write("#endif")
+        stream.write(self.commentLineBeginWith+" %s\n"%headerProtectMacroName)
+        stream.write("#endif\n")
 
 class JavaGenerator(CodeGenerator):
     """
@@ -1109,10 +1221,10 @@
 if language.lower()=="text":    
     textGen = TextGenerator(parser.AST)
     textGen.generate(output,gentype)    
-elif language.lower=="c++":
+elif language.lower()=="c++":
     cxxGen = CXXGenerator(parser.AST)
     cxxGen.generate(output,gentype)
-elif language.lower=="java":
+elif language.lower()=="java":
     cxxGen = JavaGenerator(parser.AST)
     cxxGen.generate(output,gentype)
 elif language.lower()=="python":

Index: CERTI_NetworkMessage.msg
===================================================================
RCS file: /sources/certi/certi/scripts/CERTI_NetworkMessage.msg,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -b -r1.1 -r1.2
--- CERTI_NetworkMessage.msg    16 Jul 2009 13:13:15 -0000      1.1
+++ CERTI_NetworkMessage.msg    17 Jul 2009 00:22:05 -0000      1.2
@@ -31,6 +31,7 @@
 // for message exchanged between RTIA and RTIG
 // AKA CERTI Network Message
 native NetworkMessage
+native NM_Type
 
 // Message is the base class 
 // for message exchanged between Federate and RTIA
@@ -66,11 +67,11 @@
 message NM_Resign_Federation_Execution : merge NetworkMessage {}
 
 message NM_Set_Time_Regulating : merge NetworkMessage {
-       required bool regulator
+       required onoff regulator
 }
 
 message NM_Set_Time_Constrained : merge NetworkMessage {
-       required bool regulator
+       required onoff constrained
 }
 
 message NM_Time_Regulation_Enabled : merge NetworkMessage {}
@@ -86,11 +87,11 @@
 }
 
 message NM_Set_Class_Relevance_Advisory_Switch : merge NetworkMessage {    
-       required bool classRelevanceAdvisorySwitch // value of CRA switch       
+       required onoff classRelevanceAdvisorySwitch // value of CRA switch      
 }
 
 message NM_Set_Interaction_Relevance_Advisory_Switch : merge NetworkMessage {  
  
-       required bool interactionRelevanceAdvisorySwitch // value of IRA switch 
        
+       required onoff interactionRelevanceAdvisorySwitch // value of IRA 
switch        
 }
 
 message NM_Set_Attribute_Relevance_Advisory_Switch : merge NetworkMessage {    
@@ -269,3 +270,10 @@
        required string FEDid // the FED identifier
        required string line  // one line of the FED file
 }
+
+factory NM_Factory {
+
+       factoryCreator  NetworkMessage create(NM_Type)
+       factoryReceiver NetworkMessage receive(StreamType)
+}
+




reply via email to

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