actionlanguage.g 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  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: (GLOBAL)? 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: ID;
  66. lvalue: ID;
  67. func_call: rvalue LPAREN (expression (COMMA expression)*)? RPAREN;
  68. ifelse: IF expression COLON newline block
  69. (indent ELIF expression COLON newline block)#[0]*
  70. (indent ELSE COLON newline block)#[0]?;
  71. while: WHILE expression COLON newline block;
  72. block: (indent statement)#+;
  73. func_body: block;
  74. funcdecl: func_type FUNCTION func_name LPAREN (parameter (COMMA parameter)*)? RPAREN ((COLON newline func_body) | (ASSIGN QUESTIONMARK ANYTHING newline))?;
  75. func_type: type_specifier | void;
  76. func_name: ID;
  77. void: VOID;
  78. parameter: ID COLON type_specifier;
  79. return: RETURN expression?;
  80. indent: TAB;
  81. bool: TRUE | FALSE;
  82. newline: COMM* NEWLINE;
  83. tokens{
  84. // TOKENS (written in CAPS)
  85. ID: '[a-zA-Z_][a-zA-Z_0-9.]*';
  86. ANYTHING: '[a-zA-Z_0-9/.]+';
  87. VOID: 'Void';
  88. INCLUDE: 'include';
  89. ELEMENT: 'Element';
  90. IF_NODE: 'if';
  91. WHILE_NODE: 'while';
  92. ASSIGN_NODE: 'assign';
  93. CALL_NODE: 'call';
  94. BREAK_NODE: 'break';
  95. CONTINUE_NODE: 'continue';
  96. RETURN_NODE: 'return';
  97. RESOLVE_NODE: 'resolve';
  98. ACCESS_NODE: 'access';
  99. CONSTANT_NODE: 'constant';
  100. INPUT_NODE: 'input';
  101. OUTPUT_NODE: 'output';
  102. GLOBAL_NODE: 'global';
  103. DECLARE_NODE: 'declare';
  104. FUNCTION: 'function';
  105. RETURN: 'return';
  106. GLOBAL: 'global';
  107. WHILE: 'while';
  108. IF: 'if';
  109. ELSE: 'else';
  110. ELIF: 'elif';
  111. INT: 'Integer';
  112. FLOAT: 'Float';
  113. BOOL: 'Boolean';
  114. STRING: 'String';
  115. TYPE: 'Type';
  116. ACTION: 'Action';
  117. PLUS: '\+';
  118. MINUS: '-';
  119. STAR: '\*';
  120. SLASH: '/';
  121. EXCLAMATION: '!';
  122. QUESTIONMARK: '\?';
  123. COLON: ':';
  124. SEMICOLON: ';';
  125. ASSIGN: '=';
  126. COMMA: ',';
  127. LE: '<=';
  128. GE: '>=';
  129. LT: '<';
  130. GT: '>';
  131. LPAREN: '\(';
  132. RPAREN: '\)';
  133. LCURLY: '{';
  134. RCURLY: '}';
  135. LSQUARE: '\[';
  136. RSQUARE: ']';
  137. OR: 'or';
  138. AND: 'and';
  139. NOT: 'not';
  140. EQ: '==';
  141. NEQ: '!=';
  142. DEC_NUMBER: '[+-]?(0|[1-9]\d*[lL]?)';
  143. POS_DEC_NUMBER: '(0|[1-9]\d*)';
  144. FLOAT_NUMBER: '[+-]?((\d+\.\d*|\.\d+)([eE][-+]?\d+)?|\d+[eE][-+]?\d+)';
  145. STRVALUE : 'u?r?("(?!"").*?(?<!\\)(\\\\)*?"|\'(?!\'\').*?(?<!\\)(\\\\)*?\')';
  146. LONG_STRVALUE : '(?s)u?r?(""".*?(?<!\\)(\\\\)*?"""|\'\'\'.*?(?<!\\)(\\\\)*?\'\'\')';
  147. NEWLINE: '(\r?\n)+';
  148. WS: '[ ]+' @Impl;
  149. TAB: '\t';
  150. TRUE: 'True';
  151. FALSE: 'False';
  152. COMM: '[\t]*//[^\n]*';
  153. }
  154. }