[Top][All Lists]
[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)
+}
+