1*16467b97STreehugger Robotgrammar t017parser; 2*16467b97STreehugger Robot 3*16467b97STreehugger Robotoptions { 4*16467b97STreehugger Robot language = Python; 5*16467b97STreehugger Robot} 6*16467b97STreehugger Robot 7*16467b97STreehugger Robotprogram 8*16467b97STreehugger Robot : declaration+ 9*16467b97STreehugger Robot ; 10*16467b97STreehugger Robot 11*16467b97STreehugger Robotdeclaration 12*16467b97STreehugger Robot : variable 13*16467b97STreehugger Robot | functionHeader ';' 14*16467b97STreehugger Robot | functionHeader block 15*16467b97STreehugger Robot ; 16*16467b97STreehugger Robot 17*16467b97STreehugger Robotvariable 18*16467b97STreehugger Robot : type declarator ';' 19*16467b97STreehugger Robot ; 20*16467b97STreehugger Robot 21*16467b97STreehugger Robotdeclarator 22*16467b97STreehugger Robot : ID 23*16467b97STreehugger Robot ; 24*16467b97STreehugger Robot 25*16467b97STreehugger RobotfunctionHeader 26*16467b97STreehugger Robot : type ID '(' ( formalParameter ( ',' formalParameter )* )? ')' 27*16467b97STreehugger Robot ; 28*16467b97STreehugger Robot 29*16467b97STreehugger RobotformalParameter 30*16467b97STreehugger Robot : type declarator 31*16467b97STreehugger Robot ; 32*16467b97STreehugger Robot 33*16467b97STreehugger Robottype 34*16467b97STreehugger Robot : 'int' 35*16467b97STreehugger Robot | 'char' 36*16467b97STreehugger Robot | 'void' 37*16467b97STreehugger Robot | ID 38*16467b97STreehugger Robot ; 39*16467b97STreehugger Robot 40*16467b97STreehugger Robotblock 41*16467b97STreehugger Robot : '{' 42*16467b97STreehugger Robot variable* 43*16467b97STreehugger Robot stat* 44*16467b97STreehugger Robot '}' 45*16467b97STreehugger Robot ; 46*16467b97STreehugger Robot 47*16467b97STreehugger Robotstat: forStat 48*16467b97STreehugger Robot | expr ';' 49*16467b97STreehugger Robot | block 50*16467b97STreehugger Robot | assignStat ';' 51*16467b97STreehugger Robot | ';' 52*16467b97STreehugger Robot ; 53*16467b97STreehugger Robot 54*16467b97STreehugger RobotforStat 55*16467b97STreehugger Robot : 'for' '(' assignStat ';' expr ';' assignStat ')' block 56*16467b97STreehugger Robot ; 57*16467b97STreehugger Robot 58*16467b97STreehugger RobotassignStat 59*16467b97STreehugger Robot : ID '=' expr 60*16467b97STreehugger Robot ; 61*16467b97STreehugger Robot 62*16467b97STreehugger Robotexpr: condExpr 63*16467b97STreehugger Robot ; 64*16467b97STreehugger Robot 65*16467b97STreehugger RobotcondExpr 66*16467b97STreehugger Robot : aexpr ( ('==' | '<') aexpr )? 67*16467b97STreehugger Robot ; 68*16467b97STreehugger Robot 69*16467b97STreehugger Robotaexpr 70*16467b97STreehugger Robot : atom ( '+' atom )* 71*16467b97STreehugger Robot ; 72*16467b97STreehugger Robot 73*16467b97STreehugger Robotatom 74*16467b97STreehugger Robot : ID 75*16467b97STreehugger Robot | INT 76*16467b97STreehugger Robot | '(' expr ')' 77*16467b97STreehugger Robot ; 78*16467b97STreehugger Robot 79*16467b97STreehugger RobotID : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')* 80*16467b97STreehugger Robot ; 81*16467b97STreehugger Robot 82*16467b97STreehugger RobotINT : ('0'..'9')+ 83*16467b97STreehugger Robot ; 84*16467b97STreehugger Robot 85*16467b97STreehugger RobotWS : ( ' ' 86*16467b97STreehugger Robot | '\t' 87*16467b97STreehugger Robot | '\r' 88*16467b97STreehugger Robot | '\n' 89*16467b97STreehugger Robot )+ 90*16467b97STreehugger Robot {$channel=HIDDEN} 91*16467b97STreehugger Robot ; 92