blob: 79bf8a062dddf01e04672857d79f6f1661619b43 [file] [log] [blame]
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
}