# this is the prototype for the Pugs-Compiler-Precedence module - fglock use Parse::Yapp; $DEBUG=0; $|=1; use Data::Dumper; # see also: # http://web.mit.edu/gnu/doc/html/bison_[6,8].html # notes: # 'assoc' is one of: nonassoc / right / left my $g = <<'EOT'; %{ my $out; %} %left ';' %left '-' '«+»' %left 'infix:' '/' %left NEG %right '^' %% statement: exp { return($out) } ; exp: NUM { $out= $_[1] } | STMT { $out= $_[1] } | STMT exp { $out= [ $_[1], $_[2] ] } | exp ';' STMT { $out= [ $_[1], $_[3] ] } | exp '«+»' exp { $out= [ $_[1], $_[2], $_[3] ] } | exp '-' exp { $out= [ $_[1], $_[2], $_[3] ] } | exp 'infix:' exp { $out= [ $_[1], $_[2], $_[3] ] } | exp '/' exp { $out= [ $_[1], $_[2], $_[3] ] } | '-' exp %prec NEG { $out= [ $_[1], $_[2] ] } | exp '^' exp { $out= [ $_[1], $_[2], $_[3] ] } | '(' exp ')' { $out= $_[2] } ; list_left: exp { $out= [ $_[1] ] } | list_left ',' exp { $out= [ @{$_[1]}, $_[3] ] } ; list_right: exp { $out= [ $_[1] ] } | exp ';' list_right { $out= [ $_[1], @{$_[3]} ] } ; %% EOT my $in = [ ['-'=>{op=>'-'}], ['NUM'=>{num=>'1'}], ['infix:'=>{op=>'*'}], ['NUM'=>{num=>'2'}], ['«+»'=>{op=>'+'}], ['NUM'=>{num=>'3'}], ['infix:'=>{op=>'*'}], ['NUM'=>{num=>'4'}] , [';'=>{}] , ['STMT'=>{if=>'block'}] ]; my($lex) = sub { my($t)=shift(@$in); defined($t) or $t=['','']; return($$t[0],$$t[1]); }; my($p)=new Parse::Yapp(input => $g); $p=$p->Output(classname => 'Test'); $DEBUG and print $p; eval $p; $@ and die "$@\n"; $p=new Test(yylex => $lex, yyerror => sub {}); $out=$p->YYParse; print Dumper $out; undef $p; undef(&Test::new);