#!/usr/bin/perl -w
use strict;
use Data::Dumper;
use Parse::Eyapp;
our %s; # symbol table
my $ts = q{
%token FLOAT INTEGER NAME
%{
our %s;
my %reserved_words = ( INTEGER => 'INTEGER', FLOAT => 'FLOAT');
my $validchars = qr{[,;]};
my $ID = qr{[a-z_A_Z_]\w*};
%}
%lexer {
m{\G\s+}gc; # skip whites
if (m{\G($ID)}gc) {
my $w = uc($1); # upper case the word
return ($w, $w) if exists $reserved_words{$w};
return ('NAME', $1); # not a reserved word
}
return ($1, $1) if m/\G($validchars)/gc;
}
%metatree
%%
Dl: D
| Dl ';' D
;
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 }
;
%%
};
Parse::Eyapp->new_grammar(input=>$ts, classname=>'main', outputfile=>'Types.pm');
my $parser = main->new(); # Create the parser
my $input = shift || "float x,y;\ninteger a,b\n";
$parser->input(\$input);
print "Input: $input";
my $t = $parser->YYParse() or die "Syntax Error analyzing input";
$t->translation_scheme;
$Data::Dumper::Indent = 1;
$Data::Dumper::Terse = 1;
$Data::Dumper::Deepcopy = 1;
$Data::Dumper::Deparse = 1;
print "Tree:\n".Dumper($t);
print "Symbol table:\n".Dumper(\%s);