action_lang.g 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  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 | TYPE_BOOL
  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. TYPE_BOOL: "bool"
  50. array: "[" (expr ("," expr)*)? "]"
  51. ?literal: ESCAPED_STRING -> string_literal
  52. | INT -> int_literal
  53. | FLOAT -> float_literal
  54. | bool_literal
  55. | duration_literal
  56. ?compare_operator: EQ | NEQ | GT | GEQ | LT | LEQ
  57. ?add_operator: PLUS | MINUS
  58. ?mult_operator: MULT | DIV | FLOORDIV | MOD
  59. AND: "and"
  60. OR: "or"
  61. EQ: "=="
  62. NEQ: "!="
  63. GT: ">"
  64. GEQ: ">="
  65. LT: "<"
  66. LEQ: "<="
  67. PLUS: "+"
  68. MINUS: "-"
  69. MULT: "*"
  70. DIV: "/"
  71. FLOORDIV: "//"
  72. MOD: "%"
  73. EXP: "**"
  74. NOT: "not"
  75. bool_literal: TRUE | FALSE
  76. TRUE: "True"
  77. FALSE: "False"
  78. INT: /[0-9]+/
  79. FLOAT: /[0-9]+\.[0-9]*/
  80. duration_literal: (INT duration_unit)+
  81. ?duration_unit: TIME_H | TIME_M | TIME_S | TIME_MS | TIME_US | TIME_NS | TIME_PS | TIME_FS | TIME_D
  82. TIME_H: "h"
  83. TIME_M: "m"
  84. TIME_S: "s"
  85. TIME_MS: "ms"
  86. TIME_US: "us"
  87. TIME_NS: "ns"
  88. TIME_PS: "ps"
  89. TIME_FS: "fs"
  90. TIME_D: "d" // for zero-duration
  91. // Statement parsing
  92. ?block: (stmt)*
  93. MODULE_NAME: IDENTIFIER ("." IDENTIFIER)*
  94. ?stmt: assignment ";"
  95. | expr ";" -> expression_stmt
  96. | "return" expr ";" -> return_stmt
  97. | "{" block "}" -> block
  98. | "if" "(" expr ")" stmt ("else" stmt)? -> if_stmt
  99. | "import" MODULE_NAME ";" -> import_stmt
  100. assignment: lhs assign_operator expr
  101. increment: lhs "+=" expr
  102. ?lhs: IDENTIFIER -> identifier
  103. | array_indexed
  104. ?assign_operator: ASSIGN | INCREMENT | DECREMENT | MULTIPLY | DIVIDE
  105. ASSIGN: "="
  106. INCREMENT: "+="
  107. DECREMENT: "-="
  108. MULTIPLY: "*="
  109. DIVIDE: "/="
  110. FLOORDIVIDE: "//="
  111. COMMENT: "#" /(.)*/ "\n"
  112. %ignore COMMENT