actionlanguage.g 4.9 KB

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