Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- grammar G {
- token TOP { <expression> }
- rule expression {
- | <term> $<op>='+' <expression>
- | <term> $<op>='-' <expression>
- | <term>
- }
- rule term {
- | <factor> $<op>='*' <term>
- | <factor> $<op>='/' <term>
- | <factor>
- }
- rule factor {
- | ('-')? '(' <expression> ')'
- | ('-')? <number>
- }
- token number { \d+ [ '.' \d+ ]? [ <[eE]> \d+ ]? }
- }
- class E {
- method TOP ($/) { make $<expression>.made }
- method expression ($/) {
- given $<op> {
- when '+' { make $<term>.made + $<expression>.made }
- when '-' { make $<term>.made - $<expression>.made }
- default { make $<term>.made }
- }
- }
- method term ($/){
- given $<op> {
- when '*' { make $<factor>.made ร $<term>.made }
- when '/' { make $<factor>.made รท $<term>.made }
- default { make $<factor>.made }
- }
- }
- method factor ($/) {
- my $sign = $0 ?? -1 !! 1;
- my $value;
- $value = $<expression>.made if $<expression>;
- $value = $<number>.made if $<number>;
- make $sign ร $value;
- }
- method number ($/) {
- make $/.Num
- }
- }
- say G.parse('(((((-1)))))', actions => E).made;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement