action_lang.g 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. // Grammar file for Lark-parser
  2. %import common.WS
  3. %ignore WS
  4. %import common.ESCAPED_STRING
  5. // Expression parsing
  6. // We use the same operators and operator precedence rules as Python
  7. ?expr: or_expr
  8. ?or_expr: and_expr
  9. | or_expr OR and_expr -> binary_expr
  10. ?and_expr: not_expr
  11. | and_expr AND not_expr -> binary_expr
  12. ?not_expr: comp_expr
  13. | NOT comp_expr -> unary_expr
  14. ?comp_expr: add_expr
  15. | comp_expr compare_operator add_expr -> binary_expr
  16. ?add_expr: mult_expr
  17. | add_expr add_operator mult_expr -> binary_expr
  18. ?mult_expr: unary
  19. | mult_expr mult_operator unary -> binary_expr
  20. ?unary: exponent
  21. | MINUS exponent -> unary_expr
  22. ?exponent: atom
  23. | atom EXP exponent -> binary_expr
  24. ?atom: IDENTIFIER -> identifier
  25. | "(" expr ")" -> group
  26. | literal
  27. | func_call
  28. | macro_call
  29. | array_indexed
  30. | func_decl
  31. | array
  32. IDENTIFIER: /[A-Za-z_][A-Za-z_0-9]*/
  33. MACRO_IDENTIFIER: "@" IDENTIFIER
  34. macro_call: MACRO_IDENTIFIER "(" param_list ")"
  35. func_call: atom "(" param_list ")"
  36. param_list: ( expr ("," expr)* )? -> params
  37. array_indexed: atom "[" expr "]"
  38. func_decl: "func" params_decl stmt
  39. params_decl: ( "(" param_decl ("," param_decl)* ")" )?
  40. ?param_decl: IDENTIFIER ":" type_annot
  41. type_annot: TYPE_INT | TYPE_STR | TYPE_DUR | TYPE_FLOAT
  42. | "func" param_types? return_type? -> func_type
  43. param_types: "(" type_annot ( "," type_annot )* ")"
  44. ?return_type: "->" type_annot
  45. TYPE_INT: "int"
  46. TYPE_STR: "str"
  47. TYPE_DUR: "dur"
  48. TYPE_FLOAT: "float"
  49. array: "[" (expr ("," expr)*)? "]"
  50. ?literal: ESCAPED_STRING -> string_literal
  51. | INT -> int_literal
  52. | FLOAT -> float_literal
  53. | bool_literal
  54. | duration_literal
  55. ?compare_operator: EQ | NEQ | GT | GEQ | LT | LEQ
  56. ?add_operator: PLUS | MINUS
  57. ?mult_operator: MULT | DIV | FLOORDIV | MOD
  58. AND: "and"
  59. OR: "or"
  60. EQ: "=="
  61. NEQ: "!="
  62. GT: ">"
  63. GEQ: ">="
  64. LT: "<"
  65. LEQ: "<="
  66. PLUS: "+"
  67. MINUS: "-"
  68. MULT: "*"
  69. DIV: "/"
  70. FLOORDIV: "//"
  71. MOD: "%"
  72. EXP: "**"
  73. NOT: "not"
  74. bool_literal: TRUE | FALSE
  75. TRUE: "True"
  76. FALSE: "False"
  77. INT: /[0-9]+/
  78. FLOAT: /[0-9]+\.[0-9]*/
  79. duration_literal: (INT duration_unit)+
  80. ?duration_unit: TIME_H | TIME_M | TIME_S | TIME_MS | TIME_US | TIME_NS | TIME_PS | TIME_FS | TIME_D
  81. TIME_H: "h"
  82. TIME_M: "m"
  83. TIME_S: "s"
  84. TIME_MS: "ms"
  85. TIME_US: "us"
  86. TIME_NS: "ns"
  87. TIME_PS: "ps"
  88. TIME_FS: "fs"
  89. TIME_D: "d" // for zero-duration
  90. // Statement parsing
  91. ?block: (stmt)*
  92. MODULE_NAME: IDENTIFIER ("." IDENTIFIER)*
  93. ?stmt: assignment ";"
  94. | expr ";" -> expression_stmt
  95. | "return" expr ";" -> return_stmt
  96. | "{" block "}" -> block
  97. | "if" "(" expr ")" stmt ("else" stmt)? -> if_stmt
  98. | "import" MODULE_NAME ";" -> import_stmt
  99. assignment: lhs assign_operator expr
  100. increment: lhs "+=" expr
  101. ?lhs: IDENTIFIER -> identifier
  102. | array_indexed
  103. ?assign_operator: ASSIGN | INCREMENT | DECREMENT | MULTIPLY | DIVIDE
  104. ASSIGN: "="
  105. INCREMENT: "+="
  106. DECREMENT: "-="
  107. MULTIPLY: "*="
  108. DIVIDE: "/="
  109. FLOORDIVIDE: "//="
  110. COMMENT: "#" /(.)*/ "\n"
  111. %ignore COMMENT