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