![]() Server : Apache/2.4.62 (Unix) OpenSSL/1.0.2k-fips System : Linux server1.richineiserver.com 3.10.0-1160.119.1.el7.x86_64 #1 SMP Tue Jun 4 14:43:51 UTC 2024 x86_64 User : fdshops ( 1003) PHP Version : 8.2.21 Disable Function : NONE Directory : /usr/share/doc/perl-Parse-RecDescent-1.967009/demo/ |
#!/usr/bin/perl -ws # THE COMMONEST REASON FOR WANTING LEFT RECURSION use strict; use Parse::RecDescent; $::RD_HINT = 1; sub Parse::RecDescent::evalop { $_[0][0] = $_[0][$_+1](@{$_[0]}[0,$_+2]) for map 2*($_-1), 1..@{$_[0]}/2; return $_[0][0]; } my $parse = Parse::RecDescent->new(<<'EndGrammar'); main: expr /\Z/ { $item[1] } | <error> expr: <leftop:term add_op term> { evalop($item[1]) } add_op: '+' { sub { $_[0] += $_[1] } } | '-' { sub { $_[0] -= $_[1] } } term: <leftop:factor mult_op factor> { evalop($item[1]) } mult_op: '*' { sub { $_[0] *= $_[1] } } | '/' { sub { $_[0] /= $_[1] } } factor: number | '(' expr ')' { $item[2] } number: /[-+]?\d+(\.\d+)?/ EndGrammar while (<DATA>) { print "$_ = ", $parse->main($_), "\n"; } while (print "> " and defined($_=<>)) { print "= ", $parse->main($_), "\n"; } __DATA__ 2+3 2*3 +1-1+1-1+1-1+1-1+1 7*7-6*8 121/(121/11)/121*11 1/(10-1/(1/(10-1)))