Falexom

Untitled

Oct 14th, 2024
29
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.76 KB | None | 0 0
  1. grammar MyLang;
  2.  
  3. options {
  4. language=C;
  5. output=AST;
  6. backtrack=true;
  7. }
  8.  
  9. tokens {
  10. SourceToken;
  11. CondToken;
  12. FuncDefToken;
  13. FuncSignatureToken;
  14. ArgListToken;
  15. TypeRefToken;
  16. ArrayToken;
  17. ExpressionToken;
  18. CallToken;
  19. LoopToken;
  20. RepeatToken;
  21. ArgToken;
  22. Body;
  23. }
  24.  
  25. source
  26. : sourceItem* -> ^(SourceToken sourceItem*)
  27. ;
  28.  
  29. sourceItem
  30. : 'def' funcSignature body? 'end'-> ^(FuncDefToken funcSignature body?)
  31. ;
  32.  
  33. funcSignature
  34. : identifier '(' argList ')' ('of' typeRef)? -> ^(FuncSignatureToken ^(Identifier identifier) argList? typeRef)
  35. ;
  36.  
  37. argList
  38. : arg (',' arg)* -> ^(ArgListToken arg+)
  39. ;
  40.  
  41. arg
  42. : identifier ('of' typeRef) -> ^(ArgToken ^(Identifier identifier) typeRef?)
  43. ;
  44.  
  45. statement
  46. : expression ';'!
  47. | loopStatement -> ^(LoopToken loopStatement)
  48. | breakStatement
  49. | expressionStatement
  50. | condStatement -> ^(CondToken condStatement)
  51. | repeatStatement -> ^(RepeatToken repeatStatement)
  52. ;
  53.  
  54. body
  55. : statement* -> ^(Body statement*)
  56. ;
  57.  
  58. condStatement
  59. : 'if'! expression 'then'! body? ('else'! body)?
  60. ;
  61.  
  62. loopStatement
  63. : ('while'|'until') expression body 'end'
  64. ;
  65.  
  66. repeatStatement
  67. : 'repeat' body ('while'|'until') expression ';'
  68. ;
  69.  
  70. breakStatement
  71. : 'break' ';'
  72. ;
  73.  
  74. expressionStatement
  75. : expression ';'
  76. ;
  77.  
  78. blockStatement
  79. : ('begin'|'{') (statement|source)* ('end'|'}')
  80. ;
  81.  
  82. expression
  83. : assignmentExpression
  84. ;
  85.  
  86. slice
  87. : expression '[' dec dec ']'
  88. ;
  89.  
  90. ranges
  91. : expression ('..' expression)?
  92. ;
  93.  
  94. assignmentExpression
  95. : logicalOrExpression (AssignmentOp^ assignmentExpression)?
  96. ;
  97.  
  98. logicalOrExpression
  99. : logicalAndExpression ('||'^ logicalAndExpression)*
  100. ;
  101.  
  102. logicalAndExpression
  103. : bitwiseOrExpression ('&&'^ bitwiseOrExpression)*
  104. ;
  105.  
  106. bitwiseOrExpression
  107. : bitwiseXorExpression ('|'^ bitwiseXorExpression)*
  108. ;
  109.  
  110. bitwiseXorExpression
  111. : bitwiseAndExpression ('^'^ bitwiseAndExpression)*
  112. ;
  113.  
  114. bitwiseAndExpression
  115. : equalityExpression ('&'^ equalityExpression)*
  116. ;
  117.  
  118. equalityExpression
  119. : relationalExpression (('=='|'!=')^ relationalExpression)*
  120. ;
  121.  
  122. relationalExpression
  123. : shiftExpression (RelationalOp^ shiftExpression)*
  124. ;
  125.  
  126. shiftExpression
  127. : additiveExpression (('<<'|'>>')^ additiveExpression)*
  128. ;
  129.  
  130. additiveExpression
  131. : multiplicativeExpression (('+'|'-')^ multiplicativeExpression)*
  132. ;
  133.  
  134. multiplicativeExpression
  135. : unaryExpression (('*'|'/'|'%')^ unaryExpression)*
  136. ;
  137.  
  138. unaryExpression
  139. : ('!'|'~')^ unaryExpression
  140. | (UnaryOp^)? primaryExpression
  141. ;
  142.  
  143. primaryExpression
  144. : '('! assignmentExpression ')'!
  145. | Literal
  146. | Identifier (('(') => call)*
  147. ;
  148.  
  149. expressionList
  150. : expression (','! expression)*
  151. ;
  152.  
  153. call
  154. : expression '(' expressionList ')' -> ^(CallToken expressionList?)
  155. ;
  156.  
  157.  
  158. typeRef : builtin
  159. |identifier
  160. |array
  161. ;
  162.  
  163. array
  164. : 'array' '[' dec ']' -> ArrayToken
  165. ;
  166.  
  167. builtin
  168. : BuiltIn
  169. ;
  170.  
  171.  
  172. identifier
  173. : Identifier
  174. ;
  175.  
  176. Literal
  177. : Bool
  178. | Bits
  179. | Hex
  180. | Dec
  181. | Char
  182. | Str
  183. ;
  184.  
  185. fragment
  186. Bool: ('true'|'false');
  187.  
  188. fragment
  189. Bits: '0' ('b'|'B') ('0'..'1')+;
  190.  
  191. fragment
  192. Hex : '0' ('x'|'X') ('0'..'9'|'a'..'f'|'A'..'F')+;
  193.  
  194. fragment
  195. Dec : ('0'..'9')+;
  196.  
  197. fragment
  198. Char: '\'' ~('\'') '\'';
  199.  
  200. fragment
  201. Str : '"' ( ~('"'|'\\') | ('\\'.) )* '"';
  202.  
  203. BuiltIn
  204. : 'bool'
  205. | 'byte'
  206. | 'int'
  207. | 'uint'
  208. | 'long'
  209. | 'ulong'
  210. | 'char'
  211. | 'string'
  212. ;
  213.  
  214. Identifier
  215. : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'_'|'0'..'9')*
  216. ;
  217.  
  218. AssignmentOp
  219. : ('+'|'-'|'*'|'/'|'%'|'<<'|'>>'|'&'|'^'|'|')? '='
  220. ;
  221.  
  222. RelationalOp
  223. : ('<'|'<='|'>'|'>=')
  224. ;
  225.  
  226. UnaryOp
  227. : ('++'|'--'|'+'|'-')
  228. ;
  229.  
  230. WS : (' '|'\r'|'\t'|'\u000C'|'\n') { $channel=HIDDEN; };
Advertisement
Add Comment
Please, Sign In to add comment