Guest User

Untitled

a guest
Dec 16th, 2016
277
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 0.88 KB | None | 0 0
  1. grammar Exp {
  2. token TOP { ^ <exp(2)> $ }
  3. multi rule exp(0) { \d | ['(' <exp(2)>')'] }
  4. multi rule exp($pred) { <exp($pred-1)> +% <op($pred)>}
  5.  
  6. # Ordered from loosest to tightest: should descend into
  7. # tighter operators first
  8. multi token op(2) { '+' | '-'}
  9. multi token op(1) { '*' | '/'}
  10. }
  11.  
  12. class ParseExp {
  13. method TOP($/) {
  14. make $<exp>.made;
  15. }
  16. method exp($/) {
  17. unless $<exp> {
  18. make $/;
  19. return;
  20. }
  21. unless $<exp>.elems > 1 {
  22. if $<exp>[0] {
  23. make $<exp>[0].made;
  24. } else {
  25. make $<exp>.made;
  26. }
  27. return;
  28. }
  29. given $<op>[0].Str {
  30. when "+" {
  31. make [+] $<exp>.map(*.made);
  32. }
  33. when "-" {
  34. make [-] $<exp>.map(*.made);
  35. }
  36. when "*" {
  37. make [*] $<exp>.map(*.made);
  38. }
  39. when "/" {
  40. make [/] $<exp>.map(*.made);
  41. }
  42. }
  43. }
  44. }
  45.  
  46. sub MAIN($str) {
  47. say Exp.parse($str, actions => ParseExp.new).made;
  48. }
Advertisement
Add Comment
Please, Sign In to add comment