Home | History | Annotate | Download | only in examples
      1 use strict;
      2 use warnings;
      3 
      4 use lib qw( t/lib );
      5 
      6 use Test::More;
      7 use ANTLR::Runtime::Test;
      8 
      9 plan tests => 1;
     10 
     11 TODO: {
     12 local $TODO = 'Not implemented yet';
     13 # The SimpleCalc grammar from the five minutes tutorial.
     14 g_test_output_is({ grammar => <<'GRAMMAR', test_program => <<'CODE', expected => <<'OUTPUT' });
     15 grammar Fig;
     16 options { language = Perl5; }
     17 
     18 @header {
     19 use RunFig;
     20 }
     21 
     22 @members {
     23 has 'instances' => (
     24     default => sub { {} }
     25 );
     26 }
     27 
     28 file returns [objects]
     29     :   { $objects = []; }
     30         (object { push @$objects, $object.o; })+
     31     ;
     32 
     33 object returns [o]
     34     :   qid v=ID?
     35         {
     36         $o = RunFig.newInstance($qid.text);
     37         if (defined $v) {
     38             $self->instances->{$v.text, $o);
     39         }
     40         }
     41         '{' assign[$o]* '}'
     42     ;
     43 
     44 assign[o]
     45     :   ID '=' expr ';' {RunFig.setObjectProperty(o,$ID.text,$expr.value);}
     46     ;
     47 
     48 expr returns [value]
     49     :   STRING  { $value = $STRING.text; }
     50     |   INT     { $value = Integer.valueOf($INT.text); }
     51     |   '$' ID  { $value = instances.get($ID.text); }
     52     |   '[' ']' { $value = new ArrayList(); }
     53     |   {ArrayList elements = new ArrayList(); }
     54         '[' e=expr { elements.add($e.value); }
     55             (',' e=expr { elements.add($e.value); })*
     56         ']'
     57         { $value = elements; }
     58     ;
     59 
     60 qid :   ID ('.' ID)*
     61     ;
     62 
     63 STRING : '"' .* '"' { setText(getText().substring(1, getText().length()-1)); } ;
     64 INT :   '0'..'9'+ ;
     65 ID  :   ('_'|'a'..'z'|'A'..'Z') ('_'|'a'..'z'|'A'..'Z'|'0'..'9')* ;
     66 WS  :   (' '|'\n'|'\t')+ { $channel = $self->HIDDEN; } ;
     67 CMT :   '/*' .* '*/'     { $channel = $self->HIDDEN; } ;
     68 GRAMMAR
     69 
     70 CODE
     71 
     72 OUTPUT
     73 }
     74