1*16467b97STreehugger Robotgrammar t047treeparser; 2*16467b97STreehugger Robotoptions { 3*16467b97STreehugger Robot language=Cpp; 4*16467b97STreehugger Robot output=AST; 5*16467b97STreehugger Robot} 6*16467b97STreehugger Robot 7*16467b97STreehugger Robottokens { 8*16467b97STreehugger Robot VAR_DEF; 9*16467b97STreehugger Robot ARG_DEF; 10*16467b97STreehugger Robot FUNC_HDR; 11*16467b97STreehugger Robot FUNC_DECL; 12*16467b97STreehugger Robot FUNC_DEF; 13*16467b97STreehugger Robot BLOCK; 14*16467b97STreehugger Robot} 15*16467b97STreehugger Robot 16*16467b97STreehugger Robot@lexer::includes 17*16467b97STreehugger Robot{ 18*16467b97STreehugger Robot#include "UserTestTraits.hpp" 19*16467b97STreehugger Robot} 20*16467b97STreehugger Robot@lexer::namespace 21*16467b97STreehugger Robot{ Antlr3Test } 22*16467b97STreehugger Robot 23*16467b97STreehugger Robot@parser::includes { 24*16467b97STreehugger Robot#include "UserTestTraits.hpp" 25*16467b97STreehugger Robot} 26*16467b97STreehugger Robot@parser::namespace 27*16467b97STreehugger Robot{ Antlr3Test } 28*16467b97STreehugger Robot 29*16467b97STreehugger Robotprogram 30*16467b97STreehugger Robot : declaration+ 31*16467b97STreehugger Robot ; 32*16467b97STreehugger Robot 33*16467b97STreehugger Robotdeclaration 34*16467b97STreehugger Robot : variable 35*16467b97STreehugger Robot | functionHeader ';' -> ^(FUNC_DECL functionHeader) 36*16467b97STreehugger Robot | functionHeader block -> ^(FUNC_DEF functionHeader block) 37*16467b97STreehugger Robot ; 38*16467b97STreehugger Robot 39*16467b97STreehugger Robotvariable 40*16467b97STreehugger Robot : type declarator ';' -> ^(VAR_DEF type declarator) 41*16467b97STreehugger Robot ; 42*16467b97STreehugger Robot 43*16467b97STreehugger Robotdeclarator 44*16467b97STreehugger Robot : ID 45*16467b97STreehugger Robot ; 46*16467b97STreehugger Robot 47*16467b97STreehugger RobotfunctionHeader 48*16467b97STreehugger Robot : type ID '(' ( formalParameter ( ',' formalParameter )* )? ')' 49*16467b97STreehugger Robot -> ^(FUNC_HDR type ID formalParameter+) 50*16467b97STreehugger Robot ; 51*16467b97STreehugger Robot 52*16467b97STreehugger RobotformalParameter 53*16467b97STreehugger Robot : type declarator -> ^(ARG_DEF type declarator) 54*16467b97STreehugger Robot ; 55*16467b97STreehugger Robot 56*16467b97STreehugger Robottype 57*16467b97STreehugger Robot : 'int' 58*16467b97STreehugger Robot | 'char' 59*16467b97STreehugger Robot | 'void' 60*16467b97STreehugger Robot | ID 61*16467b97STreehugger Robot ; 62*16467b97STreehugger Robot 63*16467b97STreehugger Robotblock 64*16467b97STreehugger Robot : lc='{' 65*16467b97STreehugger Robot variable* 66*16467b97STreehugger Robot stat* 67*16467b97STreehugger Robot '}' 68*16467b97STreehugger Robot -> ^(BLOCK[$lc,"BLOCK"] variable* stat*) 69*16467b97STreehugger Robot ; 70*16467b97STreehugger Robot 71*16467b97STreehugger Robotstat: forStat 72*16467b97STreehugger Robot | expr ';'! 73*16467b97STreehugger Robot | block 74*16467b97STreehugger Robot | assignStat ';'! 75*16467b97STreehugger Robot | ';'! 76*16467b97STreehugger Robot ; 77*16467b97STreehugger Robot 78*16467b97STreehugger RobotforStat 79*16467b97STreehugger Robot : 'for' '(' start=assignStat ';' expr ';' next=assignStat ')' block 80*16467b97STreehugger Robot -> ^('for' $start expr $next block) 81*16467b97STreehugger Robot ; 82*16467b97STreehugger Robot 83*16467b97STreehugger RobotassignStat 84*16467b97STreehugger Robot : ID EQ expr -> ^(EQ ID expr) 85*16467b97STreehugger Robot ; 86*16467b97STreehugger Robot 87*16467b97STreehugger Robotexpr: condExpr 88*16467b97STreehugger Robot ; 89*16467b97STreehugger Robot 90*16467b97STreehugger RobotcondExpr 91*16467b97STreehugger Robot : aexpr ( ('=='^ | '<'^) aexpr )? 92*16467b97STreehugger Robot ; 93*16467b97STreehugger Robot 94*16467b97STreehugger Robotaexpr 95*16467b97STreehugger Robot : atom ( '+'^ atom )* 96*16467b97STreehugger Robot ; 97*16467b97STreehugger Robot 98*16467b97STreehugger Robotatom 99*16467b97STreehugger Robot : ID 100*16467b97STreehugger Robot | INT 101*16467b97STreehugger Robot | '(' expr ')' -> expr 102*16467b97STreehugger Robot ; 103*16467b97STreehugger Robot 104*16467b97STreehugger RobotFOR : 'for' ; 105*16467b97STreehugger RobotINT_TYPE : 'int' ; 106*16467b97STreehugger RobotCHAR: 'char'; 107*16467b97STreehugger RobotVOID: 'void'; 108*16467b97STreehugger Robot 109*16467b97STreehugger RobotID : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')* 110*16467b97STreehugger Robot ; 111*16467b97STreehugger Robot 112*16467b97STreehugger RobotINT : ('0'..'9')+ 113*16467b97STreehugger Robot ; 114*16467b97STreehugger Robot 115*16467b97STreehugger RobotEQ : '=' ; 116*16467b97STreehugger RobotEQEQ : '==' ; 117*16467b97STreehugger RobotLT : '<' ; 118*16467b97STreehugger RobotPLUS : '+' ; 119*16467b97STreehugger Robot 120*16467b97STreehugger RobotWS : ( ' ' 121*16467b97STreehugger Robot | '\t' 122*16467b97STreehugger Robot | '\r' 123*16467b97STreehugger Robot | '\n' 124*16467b97STreehugger Robot )+ 125*16467b97STreehugger Robot { $channel=HIDDEN } 126*16467b97STreehugger Robot ; 127