actionlanguage.g 4.7 KB

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