lark.lark 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. # Lark grammar of Lark's syntax
  2. # Note: Lark is not bootstrapped, its parser is implemented in load_grammar.py
  3. start: (_item? _NL)* _item?
  4. _item: rule
  5. | token
  6. | statement
  7. rule: RULE rule_params priority? ":" expansions
  8. token: TOKEN token_params priority? ":" expansions
  9. rule_params: ["{" RULE ("," RULE)* "}"]
  10. token_params: ["{" TOKEN ("," TOKEN)* "}"]
  11. priority: "." NUMBER
  12. statement: "%ignore" expansions -> ignore
  13. | "%import" import_path ["->" name] -> import
  14. | "%import" import_path name_list -> multi_import
  15. | "%override" rule -> override_rule
  16. | "%declare" name+ -> declare
  17. !import_path: "."? name ("." name)*
  18. name_list: "(" name ("," name)* ")"
  19. ?expansions: alias (_VBAR alias)*
  20. ?alias: expansion ["->" RULE]
  21. ?expansion: expr*
  22. ?expr: atom [OP | "~" NUMBER [".." NUMBER]]
  23. ?atom: "(" expansions ")"
  24. | "[" expansions "]" -> maybe
  25. | value
  26. ?value: STRING ".." STRING -> literal_range
  27. | name
  28. | (REGEXP | STRING) -> literal
  29. | name "{" value ("," value)* "}" -> template_usage
  30. name: RULE
  31. | TOKEN
  32. _VBAR: _NL? "|"
  33. OP: /[+*]|[?](?![a-z])/
  34. RULE: /!?[_?]?[a-z][_a-z0-9]*/
  35. TOKEN: /_?[A-Z][_A-Z0-9]*/
  36. STRING: _STRING "i"?
  37. REGEXP: /\/(?!\/)(\\\/|\\\\|[^\/])*?\/[imslux]*/
  38. _NL: /(\r?\n)+\s*/
  39. %import common.ESCAPED_STRING -> _STRING
  40. %import common.SIGNED_INT -> NUMBER
  41. %import common.WS_INLINE
  42. COMMENT: /\s*/ "//" /[^\n]/* | /\s*/ "#" /[^\n]/*
  43. %ignore WS_INLINE
  44. %ignore COMMENT