Adding handling for primitives, non-primitives, and user-defined types; doesn't handl...
[iot2.git] / others / javacup / iotparser.cup
index ff3b02f55df41fd490d6f3813b4554e3fe6c052d..c6c9f6dbf9c2da880ff1146d92d412788757fbf2 100644 (file)
@@ -24,7 +24,7 @@ parser code {:
   }
 :};
 
-terminal SEMICOLON, COMMA, LPAR, RPAR, BEGIN, END, ASSIGN;
+terminal SEMICOLON, COMMA, LPAR, RPAR, LANG, RANG, BEGIN, END, ASSIGN;
 terminal PUBLIC, INTERFACE, CAPABILITY, DESCRIPTION, METHOD, REQUIRES, WITH, AS; 
 terminal TYPE;
 terminal IDENT, STRINGCONST;
@@ -141,6 +141,103 @@ param      ::= TYPE:typeprm IDENT:idprm COMMA
                pn.addChild("param_ident").setLiteral(idprm);
                RESULT = pn;
        :}
+       /* generic/template with one type, e.g. set<int> */
+    | IDENT:clsprm LANG TYPE:typegen RANG IDENT:idprm
+       {:
+               ParseNode pn = new ParseNode("param");
+               pn.addChild("param_class").setLiteral((String)clsprm + "<" + typegen + ">");
+               pn.addChild("param_ident").setLiteral(idprm);
+               RESULT = pn;
+       :}
+    | IDENT:clsprm LANG IDENT:clsgen RANG IDENT:idprm
+       {:
+               ParseNode pn = new ParseNode("param");
+               pn.addChild("param_class").setLiteral((String)clsprm + "<" + clsgen + ">");
+               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> */
+    | IDENT:clsprm LANG TYPE:typegen RANG IDENT:idprm COMMA
+       {:
+               ParseNode pn = new ParseNode("param");
+               pn.addChild("param_class").setLiteral((String)clsprm + "<" + typegen + ">");
+               pn.addChild("param_ident").setLiteral(idprm);
+               RESULT = pn;
+       :}
+    | IDENT:clsprm LANG IDENT:clsgen RANG IDENT:idprm COMMA
+       {:
+               ParseNode pn = new ParseNode("param");
+               pn.addChild("param_class").setLiteral((String)clsprm + "<" + clsgen + ">");
+               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.