}
:};
-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;
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.