diff options
Diffstat (limited to 'runtime/Perl5/t/examples/expr.t')
-rw-r--r-- | runtime/Perl5/t/examples/expr.t | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/runtime/Perl5/t/examples/expr.t b/runtime/Perl5/t/examples/expr.t new file mode 100644 index 0000000..d1096da --- /dev/null +++ b/runtime/Perl5/t/examples/expr.t @@ -0,0 +1,85 @@ +use strict; +use warnings; + +use lib qw( t/lib ); + +use Test::More; +use ANTLR::Runtime::Test; + +plan tests => 1; + +# The SimpleCalc grammar from the five minutes tutorial. +g_test_output_is({ grammar => <<'GRAMMAR', test_program => <<'CODE', expected => <<'OUTPUT' }); +grammar Expr; +options { language = Perl5; } +@header {} + +@members { + my %memory; +} + +prog: stat+ ; + +stat: expr NEWLINE { print "$expr.value\n"; } + | ID '=' expr NEWLINE + { $memory{$ID.text} = $expr.value; } + | NEWLINE + ; + +expr returns [value] + : e=multExpr { $value = $e.value; } + ( '+' e=multExpr { $value += $e.value; } + | '-' e=multExpr { $value -= $e.value; } + )* + ; + +multExpr returns [value] + : e=atom { $value = $e.value; } ('*' e=atom { $value *= $e.value; })* + ; + +atom returns [value] + : INT { $value = $INT.text; } + | ID + { + my $v = $memory{$ID.text}; + if (defined $v) { + $value = $v; + } else { + print STDERR "undefined variable $ID.text\n"; + } + } + | '(' expr ')' { $value = $expr.value; } + ; + +ID : ('a'..'z'|'A'..'Z')+ ; +INT : '0'..'9'+ ; +NEWLINE:'\r'? '\n' ; +WS : (' '|'\t')+ { $self->skip(); } ; +GRAMMAR +use strict; +use warnings; + +use ANTLR::Runtime::ANTLRStringStream; +use ANTLR::Runtime::CommonTokenStream; +use ExprLexer; +use ExprParser; + +my $in = << 'EOT'; +1 + 1 +8 - 1 +a = 10 +b = 13 +2 * a + b + 1 +EOT + +my $input = ANTLR::Runtime::ANTLRStringStream->new({ input => $in }); +my $lexer = ExprLexer->new({ input => $input }); + +my $tokens = ANTLR::Runtime::CommonTokenStream->new({ token_source => $lexer }); +my $parser = ExprParser->new({ input => $tokens }); +$parser->prog(); +CODE +2 +7 +34 +OUTPUT |