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':