xref: /aosp_15_r20/external/antlr/runtime/Perl5/examples/expr/Expr.g (revision 16467b971bd3e2009fad32dd79016f2c7e421deb)
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