#!/usr/bin/perl -w
# Test YATW s
use strict;
use Parse::Eyapp;
use Parse::Eyapp::Treeregexp;
sub TERMINAL::info { $_[0]{attr} }
my $translationscheme = q{
%token NUM = /([0-9]+(?:\.[0-9]+)?)/
%token VAR = /([A-Za-z][A-Za-z0-9_]*)/
%metatree
%left '-' '+'
%left '*'
%left NEG
%%
line: %name EXP
exp
;
exp:
%name PLUS
exp.left '+' exp.right
{ $lhs->{n} .= $left->{n} + $right->{n} }
| %name TIMES
exp.left '*' exp.right
{ $lhs->{n} = $left->{n} * $right->{n} }
| %name NUM $NUM
{ $lhs->{n} = $NUM->{attr} }
| '(' $exp ')'
%begin { $exp }
| %name MINUS
exp.left '-' exp.right
{ $lhs->{n} = $left->{n} - $right->{n} }
| %name UMINUS
'-' $exp %prec NEG
{ $lhs->{n} = -$exp->{n} }
;
%%
}; # end translation scheme
sub not_useful {
my $self = shift; # node
my $pat = $_[2]; # get the YATW object
(ref($self) eq 'CODE') or ((ref($self) eq 'TERMINAL') and ($self->{token} eq $self->{attr}))
or do { return 0 };
$pat->delete();
return 1;
}
Parse::Eyapp->new_grammar(
input=>$translationscheme,
classname=>'Calc',
firstline =>7,
);
my $parser = Calc->new(); # Create the parser
$parser->YYPrompt("Give an expression (like -2*3): ");
$parser->slurp_file('', "\n");
print ${$parser->input}; # Set the input
my $t = $parser->YYParse; # Parse it
exit(1) if $parser->YYNberr > 0;
print $t->str."\n"; # Show the tree
my $p = Parse::Eyapp::YATW->new(PATTERN => \¬_useful);
$p->s($t);
print $t->str."\n"; # Show the tree