| use strict; |
| use warnings; |
| |
| use lib qw( t/lib ); |
| |
| use Test::More; |
| use ANTLR::Runtime::Test; |
| |
| plan tests => 1; |
| |
| TODO: { |
| local $TODO = 'Not implemented yet'; |
| # The SimpleCalc grammar from the five minutes tutorial. |
| g_test_output_is({ grammar => <<'GRAMMAR', test_program => <<'CODE', expected => <<'OUTPUT' }); |
| grammar Fig; |
| options { language = Perl5; } |
| |
| @header { |
| use RunFig; |
| } |
| |
| @members { |
| has 'instances' => ( |
| default => sub { {} } |
| ); |
| } |
| |
| file returns [objects] |
| : { $objects = []; } |
| (object { push @$objects, $object.o; })+ |
| ; |
| |
| object returns [o] |
| : qid v=ID? |
| { |
| $o = RunFig.newInstance($qid.text); |
| if (defined $v) { |
| $self->instances->{$v.text, $o); |
| } |
| } |
| '{' assign[$o]* '}' |
| ; |
| |
| assign[o] |
| : ID '=' expr ';' {RunFig.setObjectProperty(o,$ID.text,$expr.value);} |
| ; |
| |
| expr returns [value] |
| : STRING { $value = $STRING.text; } |
| | INT { $value = Integer.valueOf($INT.text); } |
| | '$' ID { $value = instances.get($ID.text); } |
| | '[' ']' { $value = new ArrayList(); } |
| | {ArrayList elements = new ArrayList(); } |
| '[' e=expr { elements.add($e.value); } |
| (',' e=expr { elements.add($e.value); })* |
| ']' |
| { $value = elements; } |
| ; |
| |
| qid : ID ('.' ID)* |
| ; |
| |
| STRING : '"' .* '"' { setText(getText().substring(1, getText().length()-1)); } ; |
| INT : '0'..'9'+ ; |
| ID : ('_'|'a'..'z'|'A'..'Z') ('_'|'a'..'z'|'A'..'Z'|'0'..'9')* ; |
| WS : (' '|'\n'|'\t')+ { $channel = $self->HIDDEN; } ; |
| CMT : '/*' .* '*/' { $channel = $self->HIDDEN; } ; |
| GRAMMAR |
| |
| CODE |
| |
| OUTPUT |
| } |