Advertisement
Guest User

Untitled

a guest
Aug 19th, 2019
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Perl 6 1.13 KB | None | 0 0
  1. grammar G {
  2.     token TOP { <expression> }
  3.  
  4.     rule expression {
  5.         | <term> $<op>='+' <expression>
  6.         | <term> $<op>='-' <expression>
  7.         | <term>
  8.     }
  9.  
  10.     rule term {
  11.         | <factor> $<op>='*' <term>
  12.         | <factor> $<op>='/' <term>
  13.         | <factor>
  14.     }
  15.  
  16.     rule factor {
  17.         | ('-')? '(' <expression> ')'
  18.         | ('-')? <number>
  19.     }
  20.  
  21.     token number { \d+ [ '.' \d+ ]? [ <[eE]> \d+ ]? }
  22. }
  23.  
  24. class E {
  25.     method TOP ($/) { make $<expression>.made }
  26.  
  27.     method expression ($/) {
  28.         given $<op> {
  29.             when '+' { make $<term>.made + $<expression>.made }
  30.             when '-' { make $<term>.made - $<expression>.made }
  31.             default  { make $<term>.made                      }
  32.         }
  33.     }
  34.  
  35.     method term ($/){
  36.         given $<op> {
  37.             when '*' { make $<factor>.made ร— $<term>.made }
  38.             when '/' { make $<factor>.made รท $<term>.made }
  39.             default  { make $<factor>.made                }
  40.         }
  41.     }
  42.  
  43.     method factor ($/) {
  44.         my $sign = $0 ?? -1 !! 1;
  45.         my $value;
  46.  
  47.         $value = $<expression>.made if $<expression>;
  48.         $value = $<number>.made if $<number>;
  49.  
  50.         make $sign ร— $value;
  51.     }
  52.  
  53.     method number ($/) {
  54.         make $/.Num
  55.     }
  56. }
  57.  
  58. say G.parse('(((((-1)))))', actions => E).made;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement