// added for disjoint reachability analysis
terminal GENREACH;
+terminal GEN_DEF_REACH;
// 19.2) The Syntactic Grammar
non terminal ParseNode finally;
//non terminal ParseNode assert_statement;
non terminal ParseNode genreach_statement;
+non terminal ParseNode gen_def_reach_statement;
// 19.12) Expressions
non terminal ParseNode primary, primary_no_new_array;
non terminal ParseNode class_instance_creation_expression;
{:
RESULT=ed;
:}
-// | interface_declaration:interfaced {:
-// RESULT=(new ParseNode("interface",parser.lexer.line_num)).addChild(interfaced).getRoot();
-// :}
+ | interface_declaration:interfaced {: RESULT=interfaced; :}
| SEMICOLON {: RESULT=new ParseNode("empty",parser.lexer.line_num); :}
;
pn.addChild(name);
RESULT=pn;
:}
- | annotation:an type:type variable_declarator_id:name {:
+ | annotations:an type:type variable_declarator_id:name {:
ParseNode pn=new ParseNode("annotation_parameter",parser.lexer.line_num);
pn.addChild(type);
pn.addChild(name);
pn.addChild(alo);
RESULT=pn;
:}
-// | primary DOT THIS LPAREN argument_list_opt RPAREN SEMICOLON
-// | primary DOT SUPER LPAREN argument_list_opt RPAREN SEMICOLON
+ | primary DOT THIS LPAREN argument_list_opt RPAREN SEMICOLON
+ | primary DOT SUPER LPAREN argument_list_opt RPAREN SEMICOLON
;
// 19.9) Interfaces
RESULT=(new ParseNode("enum_declaration",parser.lexer.line_num)).addChild(ed).getRoot();
:}
// | class_declaration:class
-// | interface_declaration:interface
+ | interface_declaration:interfaced {: RESULT=interfaced; :}
| SEMICOLON {:
RESULT=new ParseNode("empty",parser.lexer.line_num);
:}
| sese_statement:st {: RESULT=st; :}
| synchronized_statement:st {: RESULT=st; :}
| genreach_statement:st {: RESULT=st; :}
+ | gen_def_reach_statement:st {: RESULT=st; :}
| throw_statement:st {: RESULT=st; :}
| try_statement:st {: RESULT=st; :}
// | assert_statement
pn.addChild(id);
RESULT=pn;
:}
-// | primitive_type:pt DOT CLASS {:
-// ParseNode pn=new ParseNode("class_type",parser.lexer.line_num);
-// pn.addChild(pt);
-// RESULT=pn;
-// :}
-// | VOID DOT CLASS
-// | array_type:at DOT CLASS {:
-// ParseNode pn=new ParseNode("class_type",parser.lexer.line_num);
-// pn.addChild(at);
-// RESULT=pn;
-// :}
+ | primitive_type:pt DOT CLASS {:
+ ParseNode pn=new ParseNode("class_type",parser.lexer.line_num);
+ pn.addChild(pt);
+ RESULT=pn;
+ :}
+ | VOID DOT CLASS {:
+ ParseNode pn=new ParseNode("class_type",parser.lexer.line_num);
+ pn.addChild("type").addChild("void");
+ RESULT=pn;
+ :}
+ | array_type:at DOT CLASS {:
+ ParseNode pn=new ParseNode("class_type",parser.lexer.line_num);
+ pn.addChild(at);
+ RESULT=pn;
+ :}
| name:name DOT CLASS {:
ParseNode pn=new ParseNode("class_type",parser.lexer.line_num);
pn.addChild("type").addChild("class").addChild(name);
RESULT=pn;
:}
-// | name DOT THIS
+ | name:name DOT THIS {:
+ ParseNode pn=new ParseNode("parentclass",parser.lexer.line_num);
+ pn.addChild("name").addChild(name);
+ RESULT=pn;
+ :}
;
class_instance_creation_expression ::=
NEWFLAG class_or_interface_type:type LPAREN argument_list_opt:args RPAREN flag_list_opt:feo {:
pn.addChild("decl").addChild("classbody").addChild(body);
RESULT=pn;
:}
-// | primary DOT NEW IDENTIFIER
-// LPAREN argument_list_opt RPAREN {:
-//
-// :}
-// | primary DOT NEW IDENTIFIER
-// LPAREN argument_list_opt RPAREN class_body
-// | name DOT NEW IDENTIFIER
-// LPAREN argument_list_opt RPAREN
-// | name DOT NEW IDENTIFIER
-// LPAREN argument_list_opt RPAREN class_body
+ | primary: base DOT NEW class_or_interface_type:type
+ LPAREN argument_list_opt:args RPAREN {:
+ ParseNode pn=new ParseNode("createobject",parser.lexer.line_num);
+ pn.addChild(type);
+ pn.addChild(args);
+ pn.addChild( "base" ).addChild( base );
+ RESULT=pn;
+
+ :}
+ | primary: base DOT NEW class_or_interface_type:type
+ LPAREN argument_list_opt:args RPAREN class_body:body {:
+ ParseNode pn=new ParseNode("createobjectcls",parser.lexer.line_num);
+ pn.addChild(type);
+ pn.addChild(args);
+ pn.addChild( "base" ).addChild( base );
+ pn.addChild("decl").addChild("classbody").addChild(body);
+ RESULT=pn;
+ :}
+ | name:id DOT NEW class_or_interface_type:type
+ LPAREN argument_list_opt:args RPAREN {:
+ ParseNode pn=new ParseNode("createobject",parser.lexer.line_num);
+ pn.addChild(type);
+ pn.addChild(args);
+ pn.addChild( "id" ).addChild( id );
+ RESULT=pn;
+ :}
+ | name:id DOT NEW class_or_interface_type:type
+ LPAREN argument_list_opt:args RPAREN class_body:body {:
+ ParseNode pn=new ParseNode("createobjectcls",parser.lexer.line_num);
+ pn.addChild(type);
+ pn.addChild(args);
+ pn.addChild("decl").addChild("classbody").addChild(body);
+ pn.addChild( "id" ).addChild( id );
+ RESULT=pn;
+ :}
;
cons_argument_list_opt ::=
{: RESULT=new ParseNode("empty",parser.lexer.line_num); :}
pn.addChild("field").addChild(id);
RESULT=pn;
:}
-// | SUPER DOT IDENTIFIER
-// | name DOT SUPER DOT IDENTIFIER
+ | SUPER DOT IDENTIFIER:id {:
+ ParseNode pn=new ParseNode("superfieldaccess",parser.lexer.line_num);
+ pn.addChild("field").addChild(id);
+ RESULT=pn;
+ :}
+ | name:name DOT SUPER DOT IDENTIFIER:id {:
+ ParseNode pn=new ParseNode("supernamefieldaccess",parser.lexer.line_num);
+ pn.addChild("base").addChild(name);
+ pn.addChild("field").addChild(id);
+ RESULT=pn;
+ :}
;
method_invocation ::=
name:name LPAREN argument_list_opt:args RPAREN {:
pn.addChild("graphName").addChild(graphName);
RESULT=pn; :}
;
+
+gen_def_reach_statement ::=
+ GEN_DEF_REACH IDENTIFIER:outputName SEMICOLON {:
+ ParseNode pn=new ParseNode("gen_def_reach",parser.lexer.line_num);
+ pn.addChild("outputName").addChild(outputName);
+ RESULT=pn; :}
+ ;