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