xref: /aosp_15_r20/external/antlr/runtime/Perl5/t/examples/expr.t (revision 16467b971bd3e2009fad32dd79016f2c7e421deb)
1*16467b97STreehugger Robotuse strict;
2*16467b97STreehugger Robotuse warnings;
3*16467b97STreehugger Robot
4*16467b97STreehugger Robotuse lib qw( t/lib );
5*16467b97STreehugger Robot
6*16467b97STreehugger Robotuse Test::More;
7*16467b97STreehugger Robotuse ANTLR::Runtime::Test;
8*16467b97STreehugger Robot
9*16467b97STreehugger Robotplan tests => 1;
10*16467b97STreehugger Robot
11*16467b97STreehugger Robot# The SimpleCalc grammar from the five minutes tutorial.
12*16467b97STreehugger Robotg_test_output_is({ grammar => <<'GRAMMAR', test_program => <<'CODE', expected => <<'OUTPUT' });
13*16467b97STreehugger Robotgrammar Expr;
14*16467b97STreehugger Robotoptions { language = Perl5; }
15*16467b97STreehugger Robot@header {}
16*16467b97STreehugger Robot
17*16467b97STreehugger Robot@members {
18*16467b97STreehugger Robot    my %memory;
19*16467b97STreehugger Robot}
20*16467b97STreehugger Robot
21*16467b97STreehugger Robotprog:   stat+ ;
22*16467b97STreehugger Robot
23*16467b97STreehugger Robotstat:   expr NEWLINE { print "$expr.value\n"; }
24*16467b97STreehugger Robot    |   ID '=' expr NEWLINE
25*16467b97STreehugger Robot        { $memory{$ID.text} = $expr.value; }
26*16467b97STreehugger Robot    |   NEWLINE
27*16467b97STreehugger Robot    ;
28*16467b97STreehugger Robot
29*16467b97STreehugger Robotexpr returns [value]
30*16467b97STreehugger Robot    :   e=multExpr { $value = $e.value; }
31*16467b97STreehugger Robot        (   '+' e=multExpr { $value += $e.value; }
32*16467b97STreehugger Robot        |   '-' e=multExpr { $value -= $e.value; }
33*16467b97STreehugger Robot        )*
34*16467b97STreehugger Robot    ;
35*16467b97STreehugger Robot
36*16467b97STreehugger RobotmultExpr returns [value]
37*16467b97STreehugger Robot    :   e=atom { $value = $e.value; } ('*' e=atom { $value *= $e.value; })*
38*16467b97STreehugger Robot    ;
39*16467b97STreehugger Robot
40*16467b97STreehugger Robotatom returns [value]
41*16467b97STreehugger Robot    :   INT { $value = $INT.text; }
42*16467b97STreehugger Robot    |   ID
43*16467b97STreehugger Robot        {
44*16467b97STreehugger Robot            my $v = $memory{$ID.text};
45*16467b97STreehugger Robot            if (defined $v) {
46*16467b97STreehugger Robot                $value = $v;
47*16467b97STreehugger Robot            } else {
48*16467b97STreehugger Robot                print STDERR "undefined variable $ID.text\n";
49*16467b97STreehugger Robot            }
50*16467b97STreehugger Robot        }
51*16467b97STreehugger Robot    |   '(' expr ')' { $value = $expr.value; }
52*16467b97STreehugger Robot    ;
53*16467b97STreehugger Robot
54*16467b97STreehugger RobotID  :   ('a'..'z'|'A'..'Z')+ ;
55*16467b97STreehugger RobotINT :   '0'..'9'+ ;
56*16467b97STreehugger RobotNEWLINE:'\r'? '\n' ;
57*16467b97STreehugger RobotWS  :   (' '|'\t')+ { $self->skip(); } ;
58*16467b97STreehugger RobotGRAMMAR
59*16467b97STreehugger Robotuse strict;
60*16467b97STreehugger Robotuse warnings;
61*16467b97STreehugger Robot
62*16467b97STreehugger Robotuse ANTLR::Runtime::ANTLRStringStream;
63*16467b97STreehugger Robotuse ANTLR::Runtime::CommonTokenStream;
64*16467b97STreehugger Robotuse ExprLexer;
65*16467b97STreehugger Robotuse ExprParser;
66*16467b97STreehugger Robot
67*16467b97STreehugger Robotmy $in = << 'EOT';
68*16467b97STreehugger Robot1 + 1
69*16467b97STreehugger Robot8 - 1
70*16467b97STreehugger Robota = 10
71*16467b97STreehugger Robotb = 13
72*16467b97STreehugger Robot2 * a + b + 1
73*16467b97STreehugger RobotEOT
74*16467b97STreehugger Robot
75*16467b97STreehugger Robotmy $input = ANTLR::Runtime::ANTLRStringStream->new({ input => $in });
76*16467b97STreehugger Robotmy $lexer = ExprLexer->new({ input => $input });
77*16467b97STreehugger Robot
78*16467b97STreehugger Robotmy $tokens = ANTLR::Runtime::CommonTokenStream->new({ token_source => $lexer });
79*16467b97STreehugger Robotmy $parser = ExprParser->new({ input => $tokens });
80*16467b97STreehugger Robot$parser->prog();
81*16467b97STreehugger RobotCODE
82*16467b97STreehugger Robot2
83*16467b97STreehugger Robot7
84*16467b97STreehugger Robot34
85*16467b97STreehugger RobotOUTPUT
86