1*16467b97STreehugger Robotgrammar Expr; 2*16467b97STreehugger Robot 3*16467b97STreehugger Robotoptions { 4*16467b97STreehugger Robot language = Perl5; 5*16467b97STreehugger Robot} 6*16467b97STreehugger Robot 7*16467b97STreehugger Robot@header { 8*16467b97STreehugger Robot} 9*16467b97STreehugger Robot 10*16467b97STreehugger Robot@members { 11*16467b97STreehugger Robot my %memory; 12*16467b97STreehugger Robot} 13*16467b97STreehugger Robot 14*16467b97STreehugger Robotprog: stat+ ; 15*16467b97STreehugger Robot 16*16467b97STreehugger Robotstat: expr NEWLINE { print "$expr.value\n"; } 17*16467b97STreehugger Robot | ID '=' expr NEWLINE 18*16467b97STreehugger Robot { $memory{$ID.text} = $expr.value; } 19*16467b97STreehugger Robot | NEWLINE 20*16467b97STreehugger Robot ; 21*16467b97STreehugger Robot 22*16467b97STreehugger Robotexpr returns [value] 23*16467b97STreehugger Robot : e=multExpr { $value = $e.value; } 24*16467b97STreehugger Robot ( '+' e=multExpr { $value += $e.value; } 25*16467b97STreehugger Robot | '-' e=multExpr { $value -= $e.value; } 26*16467b97STreehugger Robot )* 27*16467b97STreehugger Robot ; 28*16467b97STreehugger Robot 29*16467b97STreehugger RobotmultExpr returns [value] 30*16467b97STreehugger Robot : e=atom { $value = $e.value; } ('*' e=atom { $value *= $e.value; })* 31*16467b97STreehugger Robot ; 32*16467b97STreehugger Robot 33*16467b97STreehugger Robotatom returns [value] 34*16467b97STreehugger Robot : INT { $value = $INT.text; } 35*16467b97STreehugger Robot | ID 36*16467b97STreehugger Robot { 37*16467b97STreehugger Robot my $v = $memory{$ID.text}; 38*16467b97STreehugger Robot if (defined $v) { 39*16467b97STreehugger Robot $value = $v; 40*16467b97STreehugger Robot } else { 41*16467b97STreehugger Robot print STDERR "undefined variable $ID.text\n"; 42*16467b97STreehugger Robot } 43*16467b97STreehugger Robot } 44*16467b97STreehugger Robot | '(' expr ')' { $value = $expr.value; } 45*16467b97STreehugger Robot ; 46*16467b97STreehugger Robot 47*16467b97STreehugger RobotID : ('a'..'z'|'A'..'Z')+ ; 48*16467b97STreehugger RobotINT : '0'..'9'+ ; 49*16467b97STreehugger RobotNEWLINE:'\r'? '\n' ; 50*16467b97STreehugger RobotWS : (' '|'\t')+ { $self->skip(); } ; 51