#!/usr/bin/perl -w # Compile rule6.yp first: eyapp Rule6.yp # foldrule6.pl use strict; use Rule6; use Parse::Eyapp::YATW; my %BinaryOperation = (PLUS=>'+', MINUS => '-', TIMES=>'*', DIV => '/'); sub set_terminfo { no warnings; *TERMINAL::info = sub { $_[0]{attr} }; } sub is_foldable { my ($op, $left, $right); return 0 unless defined($op = $BinaryOperation{ref($_[0])}); return 0 unless ($left = $_[0]->child(0), $left->isa('NUM')); return 0 unless ($right = $_[0]->child(1), $right->isa('NUM')); my $leftnum = $left->child(0)->{attr}; my $rightnum = $right->child(0)->{attr}; $left->child(0)->{attr} = eval "$leftnum $op $rightnum"; $_[0] = $left; } my $parser = new Rule6(); my $input = "2*3"; $parser->input(\$input); my $t = $parser->YYParse; exit(1) if $parser->YYNberr > 0; &set_terminfo; print "\n***** Before ******\n"; print $t->str; my $p = Parse::Eyapp::YATW->new(PATTERN => \&is_foldable); $p->s($t); print "\n***** After ******\n"; print $t->str."\n";