Falexom

Untitled

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