Parse::Eyapp

Parse::Eyapp module contains extensions for Parse::Yapp.
Download

Parse::Eyapp Ranking & Summary

Advertisement

  • Rating:
  • License:
  • Perl Artistic License
  • Price:
  • FREE
  • Publisher Name:
  • Casiano Rodriguez-Leon
  • Publisher web site:
  • http://search.cpan.org/~casiano/Parse-Eyapp-1.110/lib/Parse/Eyapp.pod

Parse::Eyapp Tags


Parse::Eyapp Description

Parse::Eyapp module contains extensions for Parse::Yapp. Parse::Eyapp module contains extensions for Parse::Yapp.SYNOPSIS use strict; use Parse::Eyapp; use Parse::Eyapp::Treeregexp; sub TERMINAL::info { $_{attr} } my $grammar = q{ %right '=' # Lowest precedence %left '-' '+' # + and - have more precedence than = Disambiguate a-b-c as (a-b)-c %left '*' '/' # * and / have more precedence than + Disambiguate a/b/c as (a/b)/c %left NEG # Disambiguate -a-b as (-a)-b and not as -(a-b) %tree # Let us build an abstract syntax tree ... %% line: exp { $_ } /* list of expressions separated by ';' */ ; /* The %name directive defines the name of the class to which the node being built belongs */ exp: %name NUM NUM | %name VAR VAR | %name ASSIGN VAR '=' exp | %name PLUS exp '+' exp | %name MINUS exp '-' exp | %name TIMES exp '*' exp | %name DIV exp '/' exp | %name UMINUS '-' exp %prec NEG | '(' exp ')' { $_ } /* Let us simplify a bit the tree */ ; %% sub _Error { die "Syntax error near ".($_->YYCurval?$_->YYCurval:"end of file")."n" } sub _Lexer { my($parser)=shift; # The parser object for ($parser->YYData->{INPUT}) { # Topicalize m{Gs+}gc; $_ eq '' and return('',undef); m{G(+(?:.+)?)}gc and return('NUM',$1); m{G(*)}gc and return('VAR',$1); m{G(.)}gcs and return($1,$1); } } sub Run { my($self)=shift; $self->YYParse( yylex => &_Lexer, yyerror => &_Error, ); } }; # end grammar our (@all, $uminus); Parse::Eyapp->new_grammar( # Create the parser package/class input=>$grammar, classname=>'Calc', # The name of the package containing the parser firstline=>7 # String $grammar starts at line 7 (for error diagnostics) ); my $parser = Calc->new(); # Create a parser $parser->YYData->{INPUT} = "2*-3+b*0;--2n"; # Set the input my $t = $parser->Run; # Parse it! local $Parse::Eyapp::Node::INDENT=2; print "Syntax Tree:",$t->str; # Let us transform the tree. Define the tree-regular expressions .. my $p = Parse::Eyapp::Treeregexp->new( STRING => q{ { # Example of support code my %Op = (PLUS=>'+', MINUS => '-', TIMES=>'*', DIV => '/'); } constantfold: /TIMES|PLUS|DIV|MINUS/:bin(NUM($x), NUM($y)) => { my $op = $Op{ref($bin)}; $x->{attr} = eval "$x->{attr} $op $y->{attr}"; $_ = $NUM; } uminus: UMINUS(NUM($x)) => { $x->{attr} = -$x->{attr}; $_ = $NUM } zero_times_whatever: TIMES(NUM($x), .) and { $x->{attr} == 0 } => { $_ = $NUM } whatever_times_zero: TIMES(., NUM($x)) and { $x->{attr} == 0 } => { $_ = $NUM } }, OUTPUTFILE=> 'main.pm' ); $p->generate(); # Create the tranformations $t->s($uminus); # Transform UMINUS nodes $t->s(@all); # constant folding and mult. by zero local $Parse::Eyapp::Node::INDENT=0; print "nSyntax Tree after transformations:n",$t->str,"n";Requirements:· Perl Requirements: · Perl


Parse::Eyapp Related Software