actionlanguage.g 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. grammar{
  2. start: (include | vardecl | definition | funcdecl | newline)+;
  3. statement
  4. : (vardecl newline)
  5. | (assignment newline)
  6. | (return newline)
  7. | (func_call newline)
  8. | ifelse
  9. | while
  10. | (continue newline)
  11. | (break newline)
  12. | newline @Rm;
  13. primary
  14. : parenthesized
  15. | rvalue
  16. | func_call
  17. | atomvalue;
  18. assignment: lvalue ASSIGN expression;
  19. expression: binary_operation;
  20. binary_operation: disjunction;
  21. disjunction
  22. : (disjunction OR conjunction)
  23. | conjunction;
  24. conjunction
  25. : (conjunction AND comparison)
  26. | comparison;
  27. comparison
  28. : (comparison EQ relation)
  29. | (comparison NEQ relation)
  30. | relation;
  31. relation
  32. : (relation LT sum)
  33. | (relation GT sum)
  34. | (relation LE sum)
  35. | (relation GE sum)
  36. | sum;
  37. sum
  38. : (sum PLUS term)
  39. | (sum MINUS term)
  40. | term;
  41. term
  42. : (term STAR factor)
  43. | (term SLASH factor)
  44. | factor;
  45. factor
  46. : logical_not
  47. | invert_sign
  48. | keep_sign
  49. | primary;
  50. rvalue
  51. : (rvalue LSQUARE expression RSQUARE)
  52. | ID;
  53. vardecl: type_specifier ID;
  54. logical_not: NOT primary;
  55. invert_sign: MINUS primary;
  56. keep_sign: PLUS primary;
  57. definition : type_specifier ID ASSIGN atomvalue;
  58. include: INCLUDE STRVALUE newline+;
  59. continue: CONTINUE EXCLAMATION;
  60. break: BREAK EXCLAMATION;
  61. parenthesized: LPAREN expression RPAREN;
  62. atomvalue: string | integer | float | bool | type_specifier | actionname | deref;
  63. deref: QUESTIONMARK ANYTHING?;
  64. type_specifier: INT | FLOAT | BOOL | STRING | TYPE | ACTION | ELEMENT;
  65. actionname: IF_NODE | WHILE_NODE | ASSIGN_NODE | CALL_NODE | BREAK_NODE | CONTINUE_NODE | RETURN_NODE | RESOLVE_NODE | ACCESS_NODE | CONSTANT_NODE | GLOBAL_NODE | DECLARE_NODE | INPUT_NODE | OUTPUT_NODE;
  66. string: (STRVALUE|LONG_STRVALUE);
  67. integer: DEC_NUMBER;
  68. float: FLOAT_NUMBER;
  69. lvalue: ID;
  70. func_call: rvalue LPAREN (expression (COMMA expression)*)? RPAREN;
  71. ifelse: IF expression COLON newline block
  72. (indent ELIF expression COLON newline block)#[0]*
  73. (indent ELSE COLON newline block)#[0]?;
  74. while: WHILE expression COLON newline block;
  75. block: (indent statement)#+;
  76. func_body: block;
  77. funcdecl: func_type MUTABLE? FUNCTION func_name LPAREN (parameter (COMMA parameter)*)? RPAREN ((COLON newline func_body) | (ASSIGN QUESTIONMARK ANYTHING newline))?;
  78. func_type: type_specifier | void;
  79. func_name: ID;
  80. void: VOID;
  81. parameter: ID COLON type_specifier;
  82. return: RETURN expression? EXCLAMATION;
  83. indent: TAB;
  84. bool: TRUE | FALSE;
  85. newline: COMM* NEWLINE;
  86. tokens{
  87. // TOKENS (written in CAPS)
  88. VOID: 'Void';
  89. INCLUDE: 'include';
  90. ELEMENT: 'Element';
  91. IF_NODE: '!if';
  92. WHILE_NODE: '!while';
  93. ASSIGN_NODE: '!assign';
  94. CALL_NODE: '!call';
  95. BREAK_NODE: '!break';
  96. CONTINUE_NODE: '!continue';
  97. RETURN_NODE: '!return';
  98. RESOLVE_NODE: '!resolve';
  99. ACCESS_NODE: '!access';
  100. CONSTANT_NODE: '!constant';
  101. INPUT_NODE: '!input';
  102. OUTPUT_NODE: '!output';
  103. GLOBAL_NODE: '!global';
  104. DECLARE_NODE: '!declare';
  105. FUNCTION: 'function';
  106. RETURN: 'return';
  107. WHILE: 'while';
  108. IF: 'if';
  109. ELSE: 'else';
  110. ELIF: 'elif';
  111. CONTINUE: 'continue';
  112. BREAK: 'break';
  113. INT: 'Integer';
  114. FLOAT: 'Float';
  115. BOOL: 'Boolean';
  116. STRING: 'String';
  117. TYPE: 'Type';
  118. ACTION: 'Action';
  119. PLUS: '\+';
  120. MINUS: '-';
  121. STAR: '\*';
  122. SLASH: '/';
  123. EXCLAMATION: '!';
  124. QUESTIONMARK: '\?';
  125. COLON: ':';
  126. SEMICOLON: ';';
  127. ASSIGN: '=';
  128. COMMA: ',';
  129. LE: '<=';
  130. GE: '>=';
  131. LT: '<';
  132. GT: '>';
  133. LPAREN: '\(';
  134. RPAREN: '\)';
  135. LCURLY: '{';
  136. RCURLY: '}';
  137. LSQUARE: '\[';
  138. RSQUARE: ']';
  139. OR: 'or';
  140. AND: 'and';
  141. NOT: 'not';
  142. EQ: '==';
  143. NEQ: '!=';
  144. DEC_NUMBER: '[+-]?(0|[1-9]\d*[lL]?)';
  145. POS_DEC_NUMBER: '(0|[1-9]\d*)';
  146. FLOAT_NUMBER: '[+-]?((\d+\.\d*|\.\d+)([eE][-+]?\d+)?|\d+[eE][-+]?\d+)';
  147. STRVALUE : 'u?r?("(?!"").*?(?<!\\)(\\\\)*?"|\'(?!\'\').*?(?<!\\)(\\\\)*?\')';
  148. LONG_STRVALUE : '(?s)u?r?(""".*?(?<!\\)(\\\\)*?"""|\'\'\'.*?(?<!\\)(\\\\)*?\'\'\')';
  149. NEWLINE: '(\r?\n)+';
  150. WS: '[ ]+' @Impl;
  151. TAB: '\t';
  152. TRUE: 'True';
  153. FALSE: 'False';
  154. COMM: '[\t]*//[^\n]*';
  155. ID: '[a-zA-Z_][a-zA-Z_0-9.]*';
  156. ANYTHING: '[a-zA-Z_0-9/.]+';
  157. MUTABLE : 'mutable';
  158. }
  159. }