regexp_grammars_op_precedence.pl 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839
  1. #!/usr/bin/perl
  2. use 5.020;
  3. use strict;
  4. use warnings;
  5. use Regexp::Grammars;
  6. my $code = 'func (a, b) { a + b * 42 }';
  7. my $parser = qr{
  8. <[expression]>*
  9. <rule: class> class <args>? <block>
  10. <rule: function> func <args>? <block>
  11. <rule: block> \{ <[expression]>* \}
  12. <rule: args> \( <[identifier]>* % (,) \)
  13. <rule: expression> <function> | <block> | <class> | <equality_expression>
  14. <rule: eq_expr> (?: == | != ) <additive_expression>
  15. <rule: equality_expression> <additive_expression> <[eq_expr]>*
  16. <rule: add_expr> [+\-] <multiplicative_expression>
  17. <rule: additive_expression> <multiplicative_expression> <[add_expr]>*
  18. <rule: mult_expr> [*/] <primary>
  19. <rule: multiplicative_expression> <primary> <[mult_expr]>*
  20. <rule: primary> \( <expression> \) | <number> | <identifier> | - <primary>
  21. <rule: number> \d+
  22. <rule: identifier> [\pL_][\pL\pN_]*
  23. }xms;
  24. $code =~ $parser;
  25. use Data::Dump qw(pp);
  26. pp \%/;