#!/usr/bin/perl -w
use strict;
use Data::Dumper;
use Test::More tests=>2;
use_ok qw( Parse::Eyapp );
our %s; # symbol table
my $ts = q{
%token FLOAT INTEGER
%token NAME
%metatree
%%
Dl:
/* empty right hand side */
| $D ';' Dl
;
D : $T { $L->{t} = $T->{t} } $L
;
T : FLOAT { $lhs->{t} = "FLOAT" }
| INTEGER { $lhs->{t} = "INTEGER" }
;
L : $NAME { $NAME->{t} = $lhs->{t}; $::s{$NAME->{attr}} = $NAME }
| $NAME { $NAME->{t} = $lhs->{t}; $L->{t} = $lhs->{t} } ',' $L { $::s{$NAME->{attr}} = $NAME }
;
%%
};
sub Error { die "Error sintáctico\n"; }
sub make_scanner { # hagamos una clausura con la entrada
my $input = shift;
return sub {
{ # Con el redo del final hacemos un bucle "infinito"
if ($input =~ m|\G\s*INTEGER\b|igc) {
return ('INTEGER', 'INTEGER');
}
elsif ($input =~ m|\G\s*FLOAT\b|igc) {
return ('FLOAT', 'FLOAT');
}
elsif ($input =~ m|\G\s*([a-z_]\w*)\b|igc) {
return ('NAME', $1);
}
elsif ($input =~ m/\G\s*([,;])/gc) {
return ($1, $1);
}
elsif ($input =~ m/\G\s*(.)/gc) {
die "Caracter invalido: $1\n";
}
else {
return ('', undef); # end of file
}
redo;
}
}
}
Parse::Eyapp->new_grammar(input=>$ts, classname=>'Types');
my $parser = Types->new(); # Create the parser
my $scanner = make_scanner("float x,y;\ninteger a,b;\n");
# build translation scheme ...
my $t = $parser->YYParse( yylex => $scanner, yyerror => \&Error)
or die "Syntax Error analyzing input";
$Data::Dumper::Indent = 1;
$Data::Dumper::Terse = 1;
$Data::Dumper::Deepcopy = 1;
#print Dumper($t);
$t->translation_scheme;
#print Dumper($t);
# test symbol table
my $expected_symbol_table = {
'y' => bless( {
'children' => [],
'attr' => 'y',
'token' => 'NAME',
't' => 'FLOAT'
}, 'TERMINAL' ),
'a' => bless( {
'children' => [],
'attr' => 'a',
'token' => 'NAME',
't' => 'INTEGER'
}, 'TERMINAL' ),
'b' => bless( {
'children' => [],
'attr' => 'b',
'token' => 'NAME',
't' => 'INTEGER'
}, 'TERMINAL' ),
'x' => bless( {
'children' => [],
'attr' => 'x',
'token' => 'NAME',
't' => 'FLOAT'
}, 'TERMINAL' )
};
#print Dumper(\%s);
is_deeply(\%s, $expected_symbol_table, "translation scheme. Symbol table with types");