actionlanguage.g 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  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: 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. WHILE: 'while';
  107. IF: 'if';
  108. ELSE: 'else';
  109. ELIF: 'elif';
  110. INT: 'Integer';
  111. FLOAT: 'Float';
  112. BOOL: 'Boolean';
  113. STRING: 'String';
  114. TYPE: 'Type';
  115. ACTION: 'Action';
  116. PLUS: '\+';
  117. MINUS: '-';
  118. STAR: '\*';
  119. SLASH: '/';
  120. EXCLAMATION: '!';
  121. QUESTIONMARK: '\?';
  122. COLON: ':';
  123. SEMICOLON: ';';
  124. ASSIGN: '=';
  125. COMMA: ',';
  126. LE: '<=';
  127. GE: '>=';
  128. LT: '<';
  129. GT: '>';
  130. LPAREN: '\(';
  131. RPAREN: '\)';
  132. LCURLY: '{';
  133. RCURLY: '}';
  134. LSQUARE: '\[';
  135. RSQUARE: ']';
  136. OR: 'or';
  137. AND: 'and';
  138. NOT: 'not';
  139. EQ: '==';
  140. NEQ: '!=';
  141. DEC_NUMBER: '[+-]?(0|[1-9]\d*[lL]?)';
  142. POS_DEC_NUMBER: '(0|[1-9]\d*)';
  143. FLOAT_NUMBER: '[+-]?((\d+\.\d*|\.\d+)([eE][-+]?\d+)?|\d+[eE][-+]?\d+)';
  144. STRVALUE : 'u?r?("(?!"").*?(?<!\\)(\\\\)*?"|\'(?!\'\').*?(?<!\\)(\\\\)*?\')';
  145. LONG_STRVALUE : '(?s)u?r?(""".*?(?<!\\)(\\\\)*?"""|\'\'\'.*?(?<!\\)(\\\\)*?\'\'\')';
  146. NEWLINE: '(\r?\n)+';
  147. WS: '[ ]+' @Impl;
  148. TAB: '\t';
  149. TRUE: 'True';
  150. FALSE: 'False';
  151. COMM: '[\t]*//[^\n]*';
  152. }
  153. }