#!/usr/bin/perl -w
use strict;
use Data::Dumper;
use Test::More tests=>3;
use_ok qw( Parse::Eyapp );
my $ts = q{
# File TSPostfix1.eyp
%right '='
%left '-' '+'
%left '*' '/'
%left NEG
%{
use Data::Dumper;
$Data::Dumper::Indent = 1;
$Data::Dumper::Deepcopy = 1;
#$Data::Dumper::Deparse = 1;
%}
%metatree
%defaultaction { $lhs->{t} = "$_[1]->{t} $_[3]->{t} $_[2]->{attr}"; }
%%
line: $exp { $lhs->{t} = $exp->{t} }
;
exp: NUM
{ $lhs->{t} = $_[1]->{attr}; }
| VAR
{ $lhs->{t} = $_[1]->{attr}; }
| VAR '=' exp
{ $lhs->{t} = "$_[1]->{attr} $_[3]->{t} $_[2]->{attr}"; }
| exp '+' exp
| exp '-' exp
| exp '*' exp
| exp '/' exp
| '-' exp %prec NEG { $_[0]->{t} = "$_[2]->{t} NEG" }
| '(' exp ')' %begin { $_[2] }
;
%%
sub _Error {
exists $_[0]->YYData->{ERRMSG}
and do {
print $_[0]->YYData->{ERRMSG};
delete $_[0]->YYData->{ERRMSG};
return;
};
my($token)=$_[0]->YYCurval;
my($what)= $token ? "input: '$token'" : "end of input";
die "Syntax error near $what.\n";
}
our $x;
sub _Lexer {
my($parser)=shift;
defined($x) or return('',undef);
$x =~ s/^\s+//;
$x =~ s/^([0-9]+(?:\.[0-9]+)?)// and return('NUM',$1);
$x =~ s/^([A-Za-z][A-Za-z0-9_]*)// and return('VAR',$1);
$x =~ s/^(.)//s and return($1,$1);
}
}; #end translation scheme
$Data::Dumper::Indent = 1;
$Data::Dumper::Terse = 1;
$Data::Dumper::Deepcopy = 1;
Parse::Eyapp->new_grammar(input=>$ts,
classname=>'main',
firstline => 7,
#outputfile => 'main.pm'
);
my $parser = main->new();
our $x = "a = 2*-(3+b)";
my $t = $parser->YYParse(yylex => \&_Lexer, yyerror => \&_Error)
or die "Syntax Error analyzing input";
$t->translation_scheme;
#print Dumper($t);
is($t->{t}, "a 2 3 b + NEG * =", "postfix translation a = 2*-(3+b)");
$x = "a = -c/-(3-b)";
$t = $parser->YYParse(yylex => \&_Lexer, yyerror => \&_Error)
or die "Syntax Error analyzing input";
$t->translation_scheme;
is($t->{t}, "a c NEG 3 b - NEG / =", "postfix translation a = -c/-(3-b)");
#print Dumper($t);