%{ use strict; use Parse::DSLUtils qw(:all); %} %token INT %left '+' '-' %left '*' '/' %% z : c EOF {return 0;} ; c : { } | c exp ';' { print " = $_[2]\n"; } ; exp : exp '+' exp {$_[1]+$_[3] } | exp '-' exp {$_[1]-$_[3] } | exp '*' exp {$_[1]*$_[3] } | exp '/' exp {$_[1]/$_[3] } | '(' exp ')' {$_[2] } | INT {print SDTERR "...INT($_[1])\n"; $_[1] } ; %% %dislex ex4.dislex %parse_decl package main; my $f=shift or die("usage: $0 file\n"); ex4::parseFile($f);