frontend: add support for discrimiator fields
In an abstract base class (e.g., of_action), the dicriminator field
represents the field that distinguishes between different type of
subclasses. It is marked in the base class with a '== ?', as in
uint32_t type == ?
Each class may only define at most one discriminator field.
diff --git a/loxi_front_end/frontend.py b/loxi_front_end/frontend.py
index bba941c..70699e0 100644
--- a/loxi_front_end/frontend.py
+++ b/loxi_front_end/frontend.py
@@ -46,6 +46,8 @@
return OFFieldLengthMember(name=m_ast[2], oftype=m_ast[1], field_name='actions')
else:
return OFDataMember(name=m_ast[2], oftype=m_ast[1])
+ elif m_ast[0] == 'discriminator':
+ return OFDiscriminatorMember(name=m_ast[2], oftype=m_ast[1])
else:
raise Exception("Dont know how to create member: %s" % m_ast[0])
@@ -65,11 +67,17 @@
# 0: "enum"
# 1: name
# 2: potentially list of [param_name, param_value]
- # 3: super_class
+ # 3: super_class or None
# 4: list of [constant_name, constant_value]+
- super_class = decl_ast[3]
+ superclass = decl_ast[3]
members = [create_member(m_ast) for m_ast in decl_ast[4]]
- ofclass = OFClass(name=decl_ast[1], members=members, super_class=super_class,
+
+ discriminators = [ m for m in members if isinstance(m, OFDiscriminatorMember) ]
+ if len(discriminators) > 1:
+ raise Exception("%s: Cannot support more than one discriminator by class - got %s" %
+ (decl_ast[1], repr(discriminators)))
+ ofclass = OFClass(name=decl_ast[1], members=members, superclass=superclass,
+ virtual = len(discriminators) > 0,
params = { param: value for param, value in decl_ast[2] })
ofinput.classes.append(ofclass)
if decl_ast[0] == 'enum':