#!/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