actionlanguage.g 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. grammar{
  2. start: (include | vardecl | definition | funcdecl | newline)+;
  3. definition : type_specifier ID ASSIGN atomvalue;
  4. include: INCLUDE STRVALUE newline+;
  5. statement
  6. : (vardecl newline)
  7. | (assignment newline)
  8. | (return newline)
  9. | (func_call newline)
  10. | ifelse
  11. | while
  12. | newline @Rm;
  13. vardecl: type_specifier ID;
  14. assignment
  15. : lvalue ASSIGN expression;
  16. expression
  17. : binary_operation;
  18. binary_operation
  19. : disjunction;
  20. disjunction
  21. : (disjunction OR conjunction)
  22. | conjunction;
  23. conjunction
  24. : (conjunction AND comparison)
  25. | comparison;
  26. comparison
  27. : (comparison EQ relation)
  28. | (comparison NEQ relation)
  29. | relation;
  30. relation
  31. : (relation LT sum)
  32. | (relation GT sum)
  33. | (relation LE sum)
  34. | (relation GE sum)
  35. | sum;
  36. sum
  37. : (sum PLUS term)
  38. | (sum MINUS term)
  39. | term;
  40. term
  41. : (term STAR factor)
  42. | (term SLASH factor)
  43. | factor;
  44. factor
  45. : logical_not
  46. | invert_sign
  47. | keep_sign
  48. | primary;
  49. logical_not
  50. : NOT primary;
  51. invert_sign
  52. : MINUS primary;
  53. keep_sign
  54. : PLUS primary;
  55. primary
  56. : parenthesized
  57. | rvalue
  58. | func_call
  59. | atomvalue;
  60. parenthesized
  61. : 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. rvalue
  70. : (rvalue LSQUARE expression RSQUARE)
  71. | ID;
  72. lvalue: ID;
  73. func_call: rvalue LPAREN (expression (COMMA expression)*)? RPAREN;
  74. ifelse: IF expression COLON newline block
  75. (indent ELIF expression COLON newline block)#[0]*
  76. (indent ELSE COLON newline block)#[0]?;
  77. while: WHILE expression COLON newline block;
  78. block: (indent statement)#+;
  79. func_body: block;
  80. funcdecl: func_type FUNCTION func_name LPAREN (parameter (COMMA parameter)*)? RPAREN ((COLON newline func_body) | (ASSIGN QUESTIONMARK ANYTHING newline))?;
  81. func_type: type_specifier | void;
  82. func_name: ID;
  83. void: VOID;
  84. parameter: ID COLON type_specifier;
  85. return: RETURN expression? EXCLAMATION;
  86. indent: TAB;
  87. bool: TRUE | FALSE;
  88. newline: COMM* NEWLINE;
  89. tokens{
  90. // TOKENS (written in CAPS)
  91. VOID: 'Void';
  92. INCLUDE: 'include';
  93. ELEMENT: 'Element';
  94. IF_NODE: '!if';
  95. WHILE_NODE: '!while';
  96. ASSIGN_NODE: '!assign';
  97. CALL_NODE: '!call';
  98. BREAK_NODE: '!break';
  99. CONTINUE_NODE: '!continue';
  100. RETURN_NODE: '!return';
  101. RESOLVE_NODE: '!resolve';
  102. ACCESS_NODE: '!access';
  103. CONSTANT_NODE: '!constant';
  104. INPUT_NODE: '!input';
  105. OUTPUT_NODE: '!output';
  106. GLOBAL_NODE: '!global';
  107. DECLARE_NODE: '!declare';
  108. FUNCTION: 'function';
  109. RETURN: 'return';
  110. WHILE: 'while';
  111. IF: 'if';
  112. ELSE: 'else';
  113. ELIF: 'elif';
  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. }
  159. }