Extending parser for struct/enum (policy) definition files; Removing parser support...
[iot2.git] / others / javacup / iotparser.cup
index 36dcb7a31f841069d4fad4428950e2b98acd5aa1..be96c46279e9c48ccbffd9c8d6bf4887bfc53c41 100644 (file)
@@ -25,7 +25,7 @@ parser code {:
 :};
 
 terminal SEMICOLON, COMMA, LPAR, RPAR, LANG, RANG, BEGIN, END, ASSIGN;
-terminal PUBLIC, INTERFACE, CAPABILITY, DESCRIPTION, METHOD, REQUIRES, WITH, AS; 
+terminal PUBLIC, INTERFACE, CAPABILITY, DESCRIPTION, METHOD, REQUIRES, WITH, AS, ENUM, STRUCT
 terminal TYPE;
 terminal IDENT, STRINGCONST;
 
@@ -33,6 +33,9 @@ non terminal ParseNode policy;
 non terminal ParseNode intface, methlist, meth, paramlist, param, paramtype;
 non terminal ParseNode capablist, capab, capabcont, cont;
 non terminal ParseNode reqlist, require, capintlist;
+non terminal ParseNode enumdec, enumlist, enummem;
+non terminal ParseNode structdec, structlist, structmem;
+
 
 /**
  * A policy file normally consists of:
@@ -44,6 +47,11 @@ non terminal ParseNode reqlist, require, capintlist;
  * to declare their required capabilities in the
  * generated interfaces
  * 2) List of generated interfaces (requires)
+ *
+ * Additionally we support declarations for these
+ * data types:
+ * 3) Enumeration
+ * 4) Struct
  */
 policy     ::= intface:in
        {:
@@ -57,6 +65,18 @@ policy     ::= intface:in
                pn.addChild(rl);
                RESULT = pn;
        :}
+       | enumdec:en
+       {:
+               ParseNode pn = new ParseNode("policy");
+               pn.addChild(en);
+               RESULT = pn;
+       :}
+       | structdec:st
+       {:
+               ParseNode pn = new ParseNode("policy");
+               pn.addChild(st);
+               RESULT = pn;
+       :}
     ;
 
 //1) Interface class definition
@@ -141,7 +161,7 @@ param      ::= TYPE:typeprm IDENT:idprm COMMA
                pn.addChild("param_ident").setLiteral(idprm);
                RESULT = pn;
        :}
-       /* generic/template with one type, e.g. set<int> */
+       /* generic/template with one type, e.g. list<int> */
     | IDENT:clsprm LANG TYPE:typegen RANG IDENT:idprm
        {:
                ParseNode pn = new ParseNode("param");
@@ -156,41 +176,8 @@ param      ::= TYPE:typeprm IDENT:idprm COMMA
                pn.addChild("param_ident").setLiteral(idprm);
                RESULT = pn;
        :}
-       /* generic/template with two types, e.g. map<int,string> */
-    | IDENT:clsprm LANG TYPE:typegen1 COMMA TYPE:typegen2 RANG IDENT:idprm
-       {:
-               ParseNode pn = new ParseNode("param");
-               pn.addChild("param_class").setLiteral((String)clsprm 
-                       + "<" + typegen1 + "," + typegen2 + ">");
-               pn.addChild("param_ident").setLiteral(idprm);
-               RESULT = pn;
-       :}
-    | IDENT:clsprm LANG TYPE:typegen COMMA IDENT:clsgen RANG IDENT:idprm
-       {:
-               ParseNode pn = new ParseNode("param");
-               pn.addChild("param_class").setLiteral((String)clsprm 
-                       + "<" + typegen + "," + clsgen + ">");
-               pn.addChild("param_ident").setLiteral(idprm);
-               RESULT = pn;
-       :}
-    | IDENT:clsprm LANG IDENT:clsgen COMMA TYPE:typegen RANG IDENT:idprm
-       {:
-               ParseNode pn = new ParseNode("param");
-               pn.addChild("param_class").setLiteral((String)clsprm 
-                       + "<" + clsgen + "," + typegen + ">");
-               pn.addChild("param_ident").setLiteral(idprm);
-               RESULT = pn;
-       :}
-    | IDENT:clsprm LANG IDENT:clsgen1 COMMA IDENT:clsgen2 RANG IDENT:idprm
-       {:
-               ParseNode pn = new ParseNode("param");
-               pn.addChild("param_class").setLiteral((String)clsprm 
-                       + "<" + clsgen1 + "," + clsgen2 + ">");
-               pn.addChild("param_ident").setLiteral(idprm);
-               RESULT = pn;
-       :}
        /* Add comma at the end... */
-       /* generic/template with one type, e.g. set<int> */
+       /* generic/template with one type, e.g. list<int> */
     | IDENT:clsprm LANG TYPE:typegen RANG IDENT:idprm COMMA
        {:
                ParseNode pn = new ParseNode("param");
@@ -205,39 +192,6 @@ param      ::= TYPE:typeprm IDENT:idprm COMMA
                pn.addChild("param_ident").setLiteral(idprm);
                RESULT = pn;
        :}
-       /* generic/template with two types, e.g. map<int,string> */
-    | IDENT:clsprm LANG TYPE:typegen1 COMMA TYPE:typegen2 RANG IDENT:idprm COMMA
-       {:
-               ParseNode pn = new ParseNode("param");
-               pn.addChild("param_class").setLiteral((String)clsprm 
-                       + "<" + typegen1 + "," + typegen2 + ">");
-               pn.addChild("param_ident").setLiteral(idprm);
-               RESULT = pn;
-       :}
-    | IDENT:clsprm LANG TYPE:typegen COMMA IDENT:clsgen RANG IDENT:idprm COMMA
-       {:
-               ParseNode pn = new ParseNode("param");
-               pn.addChild("param_class").setLiteral((String)clsprm 
-                       + "<" + typegen + "," + clsgen + ">");
-               pn.addChild("param_ident").setLiteral(idprm);
-               RESULT = pn;
-       :}
-    | IDENT:clsprm LANG IDENT:clsgen COMMA TYPE:typegen RANG IDENT:idprm COMMA
-       {:
-               ParseNode pn = new ParseNode("param");
-               pn.addChild("param_class").setLiteral((String)clsprm 
-                       + "<" + clsgen + "," + typegen + ">");
-               pn.addChild("param_ident").setLiteral(idprm);
-               RESULT = pn;
-       :}
-    | IDENT:clsprm LANG IDENT:clsgen1 COMMA IDENT:clsgen2 RANG IDENT:idprm COMMA
-       {:
-               ParseNode pn = new ParseNode("param");
-               pn.addChild("param_class").setLiteral((String)clsprm 
-                       + "<" + clsgen1 + "," + clsgen2 + ">");
-               pn.addChild("param_ident").setLiteral(idprm);
-               RESULT = pn;
-       :}
     ;
 
 //2) List of capabilities and their respective contents, i.e. description, method, etc.
@@ -324,3 +278,79 @@ capintlist ::= IDENT:idcap
        :}
        ;
 
+//4) Enumeration declaration
+enumdec                ::= ENUM IDENT:idenumdec BEGIN enumlist:el END
+       {:
+               ParseNode pn = new ParseNode("enum_dec");
+               pn.addChild("enum_dec_ident").setLiteral(idenumdec);
+               pn.addChild(el);
+               RESULT = pn;
+       :}
+    ;
+enumlist       ::= enumlist:el enummem:e
+       {:
+               el.addChild(e);
+               RESULT = el;
+       :}
+    | /* empty */
+       {:
+               ParseNode pn = new ParseNode("enum_list");
+               RESULT = pn;
+       :}
+    ;
+enummem                ::= IDENT:idenum COMMA
+       {:
+               ParseNode pn = new ParseNode("enum_mem");
+               pn.addChild("enum_ident").setLiteral(idenum);
+               RESULT = pn;
+       :}
+    | IDENT:idenum
+       {:
+               ParseNode pn = new ParseNode("enum_mem");
+               pn.addChild("enum_ident").setLiteral(idenum);
+               RESULT = pn;
+       :}
+    ;
+
+//5) Struct declaration
+structdec      ::= STRUCT IDENT:idstructdec BEGIN structlist:sl END
+       {:
+               ParseNode pn = new ParseNode("struct_dec");
+               pn.addChild("struct_dec_ident").setLiteral(idstructdec);
+               pn.addChild(sl);
+               RESULT = pn;
+       :}
+    ;
+structlist     ::= structlist:sl structmem:s
+       {:
+               sl.addChild(s);
+               RESULT = sl;
+       :}
+    | /* empty */
+       {:
+               ParseNode pn = new ParseNode("enum_list");
+               RESULT = pn;
+       :}
+    ;
+structmem      ::= TYPE:typestr IDENT:idstr SEMICOLON
+       {:
+               ParseNode pn = new ParseNode("struct_mem");
+               pn.addChild("struct_type").setLiteral(typestr);
+               pn.addChild("struct_ident").setLiteral(idstr);
+               RESULT = pn;
+       :}
+    | IDENT:clsstr IDENT:idstr SEMICOLON
+       {:
+               ParseNode pn = new ParseNode("struct_mem");
+               pn.addChild("struct_class").setLiteral(clsstr);
+               pn.addChild("struct_ident").setLiteral(idstr);
+               RESULT = pn;
+       :}
+    | IDENT:clsstr LANG IDENT:clsgen RANG IDENT:idstr SEMICOLON
+       {:
+               ParseNode pn = new ParseNode("struct_mem");
+               pn.addChild("struct_class").setLiteral((String)clsstr + "<" + clsgen + ">");
+               pn.addChild("struct_ident").setLiteral(idstr);
+               RESULT = pn;
+       :}
+    ;