Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- grammar Exp {
- token TOP { ^ <exp(2)> $ }
- multi rule exp(0) { \d | ['(' <exp(2)>')'] }
- multi rule exp($pred) { <exp($pred-1)> +% <op($pred)>}
- # Ordered from loosest to tightest: should descend into
- # tighter operators first
- multi token op(2) { '+' | '-'}
- multi token op(1) { '*' | '/'}
- }
- class ParseExp {
- method TOP($/) {
- make $<exp>.made;
- }
- method exp($/) {
- unless $<exp> {
- make $/;
- return;
- }
- unless $<exp>.elems > 1 {
- if $<exp>[0] {
- make $<exp>[0].made;
- } else {
- make $<exp>.made;
- }
- return;
- }
- given $<op>[0].Str {
- when "+" {
- make [+] $<exp>.map(*.made);
- }
- when "-" {
- make [-] $<exp>.map(*.made);
- }
- when "*" {
- make [*] $<exp>.map(*.made);
- }
- when "/" {
- make [/] $<exp>.map(*.made);
- }
- }
- }
- }
- sub MAIN($str) {
- say Exp.parse($str, actions => ParseExp.new).made;
- }
Advertisement
Add Comment
Please, Sign In to add comment