Advertisement
YahiaOsama

Untitled

Apr 22nd, 2019
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.06 KB | None | 0 0
  1. grammar milestone_2;
  2.  
  3. tokens { INDENT, DEDENT }
  4.  
  5. start : (stmt NEWLINE?)* EOF;
  6.  
  7. stmt : complexOrSimpleStmt | NEWLINE | INDENT? NEWLINE DEDENT?;
  8.  
  9. complexOrSimpleStmt : complexStmt | simpleStmt;
  10.  
  11. complexStmt : ifStmt | forStmt | whileStmt | procStmt | functionCall | whenStmt | caseStmt | typeStmt | blockStmt | macroStmt | templateStmt | condStmt;
  12.  
  13. simpleStmt : varStmt | constStmt | letStmt | identifierAssignment | echoStmt | assertStmt | importStmt | fromStmt | continueStmt | returnStmt | breakStmt | discardStmt;
  14.  
  15. identifierAssignment : IDENTIFIER array? (EQUALS|COLON) expression SEMI_COLON?;
  16.  
  17. identifierOperand : UNARY_OPERATOR? ( IDENTIFIER? array | singleValue | functionCall | (IDENTIFIER (DOT (IDENTIFIER | functionCall ))*)
  18. | ARRAY OPEN_BRACK NUMBER_LIT+ (RANGE NUMBER_LIT+)? COMMA INT CLOSE_BRACK
  19. | (NUMBER_LIT | CHAR_LIT) RANGE (identifierOperand)) | ternaryExpr | dataType;
  20.  
  21. letStmt : LET (identifierAssignment | NEWLINE INDENT letBlock DEDENT);
  22.  
  23. letBlock : identifierAssignment(NEWLINE identifierAssignment)* NEWLINE?;
  24.  
  25. equationStmt : identifierOperand ( operator identifierOperand)? (DOT functionCall)? | OPEN_PAREN equationStmt CLOSE_PAREN;
  26.  
  27. ternaryExpr : IF condStmt COLON expression ELSE COLON expression;
  28.  
  29. expression : (OPEN_PAREN expression CLOSE_PAREN (DOT functionCall)? | equationStmt (operator equationStmt)? );
  30.  
  31. discardStmt : DISCARD;
  32.  
  33. continueStmt : CONTINUE;
  34.  
  35. breakStmt : BREAK IDENTIFIER?;
  36.  
  37. returnStmt : RETURN expression?;
  38.  
  39. operator : ADD_OPERATOR | DIV_OPERATOR | DIV | MOD | MUL_OPERATOR | MINUS_OPERATOR | MODULUS | XOR_OPERATOR | AND_OPERATOR | OR_OPERATOR;
  40.  
  41. UNARY_OPERATOR : AT_OPERATOR | DOLLAR_OPERATOR | NOT;
  42.  
  43. BOOLEAN : TRUE | FALSE | 'bool';
  44.  
  45. array : OPEN_BRACK (declareElements | expression | dataType)? CLOSE_BRACK;
  46.  
  47. declareElements : singleValue (COMMA singleValue)*;
  48.  
  49. singleValue : CHAR_LIT | STR_LIT | (ADD_OPERATOR | MINUS_OPERATOR)? NUMBER_LIT | RSTR_LIT | TRIPLESTR_LIT | BOOLEAN;
  50.  
  51. blockStmt : BLOCK IDENTIFIER COLON NEWLINE INDENT stmt+ NEWLINE? DEDENT;
  52.  
  53. varStmt : VARIABLE (colonOrAssignment | (NEWLINE? INDENT? varBlock DEDENT?));
  54.  
  55. varBlock : (varColonStmt NEWLINE+)+;
  56.  
  57. varColonStmt : IDENTIFIER (COMMA IDENTIFIER)* COLON (dataType|identifierAssignment);
  58.  
  59. colonOrAssignment : ((identifierAssignment|varColonStmt));
  60.  
  61. constStmt : CONST (identifierAssignment | (NEWLINE INDENT constBlock DEDENT) );
  62.  
  63. constBlock : identifierAssignment (NEWLINE identifierAssignment)* NEWLINE?;
  64.  
  65. condExpr : expression (COMP_OPERATOR expression)*;
  66.  
  67. condStmt : condExpr (boolOperator condExpr)*;
  68.  
  69. boolOperator : AND | OR;
  70.  
  71. whenStmt : WHEN condStmt COLON ( (stmt NEWLINE?) | ifBody) elifStmt* elseStmt?;
  72.  
  73. ifStmt : IF condStmt COLON ( (stmt NEWLINE?) | ifBody) elifStmt* elseStmt?;
  74.  
  75. ifBody : NEWLINE INDENT stmt+ NEWLINE? DEDENT;
  76.  
  77. elifStmt : ELIF condStmt COLON NEWLINE INDENT stmt+ NEWLINE? DEDENT;
  78. elseStmt : ELSE COLON (stmt | NEWLINE INDENT stmt+ NEWLINE? DEDENT);
  79.  
  80. echoStmt :
  81. ECHO OPEN_PAREN (expression) (COMMA (expression) )* CLOSE_PAREN
  82. | ECHO (expression) (COMMA (expression))*;
  83.  
  84. assertStmt : ASSERT NUMBER_LIT COMP_OPERATOR NUMBER_LIT ;
  85.  
  86. functionParam : expression | IDENTIFIER EQUALS singleValue | varColonStmt ;
  87.  
  88. functionInput : (OPEN_PAREN (functionParam (COMMA functionParam)*)? CLOSE_PAREN) | (functionParam (COMMA functionParam)*);
  89.  
  90. functionCall : (IDENTIFIER (DOT IDENTIFIER)* | IDENTIFIER? array) functionInput?;
  91.  
  92. forIdentifier : IDENTIFIER (COMMA IDENTIFIER)* ;
  93.  
  94. forStmt : FOR forIdentifier IN identifierOperand COLON NEWLINE? INDENT? stmt+ NEWLINE? DEDENT? ;
  95.  
  96. whileStmt : WHILE condStmt COLON NEWLINE INDENT stmt+ NEWLINE? DEDENT;
  97.  
  98. typeStmt : TYPE NEWLINE INDENT typeDecl (NEWLINE typeDecl)* (NEWLINE INDENT stmt NEWLINE? DEDENT)? NEWLINE? DEDENT;
  99.  
  100. typeDecl : IDENTIFIER array? EQUALS REF? identifierOperand ;
  101.  
  102. caseStmt : CASE IDENTIFIER (COLON dataType)? NEWLINE (ofStmt)+ elseStmt?;
  103.  
  104. importStmt : IMPORT IDENTIFIER (COMMA IDENTIFIER)* ;
  105.  
  106. fromStmt: FROM IDENTIFIER(COMMA IDENTIFIER)* importStmt;
  107.  
  108. ofStmt : OF (singleValue(COMMA singleValue)*) COLON ofBody ;
  109.  
  110. ofBody : NEWLINE? INDENT? (stmt)+ NEWLINE? DEDENT?;
  111.  
  112. procStmt : procDef (COLON dataType)? EQUALS procBody;
  113.  
  114. procBody : stmt | NEWLINE INDENT stmt+ NEWLINE? DEDENT;
  115.  
  116. procInputDef : IDENTIFIER (COLON dataType | EQUALS singleValue)?;
  117.  
  118. procIdentDef : (IDENTIFIER| GRAVE_ACCENT UNARY_OPERATOR GRAVE_ACCENT) ( array )? ;
  119.  
  120. procDef : PROC procIdentDef? OPEN_PAREN procInputDef (COMMA procInputDef)* CLOSE_PAREN ;
  121.  
  122. macroDef : MACRO procIdentDef? OPEN_PAREN procInputDef (SEMI_COLON procInputDef)* CLOSE_PAREN ;
  123.  
  124. macroStmt : macroDef (COLON dataType)? EQUALS procBody;
  125.  
  126. pragma : OPEN_BRACE DOT IDENTIFIER CLOSE_BRACE ;
  127.  
  128. templateDef : TEMPLATE procIdentDef? OPEN_PAREN procInputDef (COMMA procInputDef)* CLOSE_PAREN ;
  129.  
  130. templateStmt : templateDef pragma? EQUALS procBody ;
  131.  
  132. SKIP_ : WS -> skip;
  133.  
  134. dataType : IDENTIFIER | STRING | INT | BOOLEAN | OBJECT | procDef | VARIABLE? IDENTIFIER array;
  135.  
  136. STRING : 'string';
  137. INT : 'int';
  138. TRUE : 'true';
  139. FALSE : 'false';
  140. MULTI_LINE_COMMENT : '#['(MULTI_LINE_COMMENT|.)*?']#';
  141. DOCUMENTATION_COMMENTS : '##'.*? (NEWLINE | EOF);
  142. COMMENT : '#'(.)*? (NEWLINE | EOF);
  143. NEWLINE : '\r'? '\n' WS?;
  144. fragment WS : ' '+;
  145.  
  146. ARRAY :'array';
  147. INCLUDE : 'include';
  148. INTERFACE : 'interface';
  149. IS : 'is';
  150. ISNOT : 'isnot';
  151. ITERATOR : 'iterator';
  152. LET : 'let';
  153. MACRO : 'macro';
  154. METHOD : 'method';
  155. MIXIN : 'mixin';
  156. MOD : 'mod';
  157. NIL : 'nil';
  158. NOT : 'not';
  159. NOTIN : 'notin';
  160. OBJECT : 'object';
  161. OF : 'of';
  162. OR : 'or';
  163. OUT : 'out';
  164. PROC : 'proc';
  165. PTR : 'ptr';
  166. RAISE : 'raise';
  167. REF : 'ref';
  168. RETURN : 'return';
  169. SHL : 'shl';
  170. SHR : 'shr';
  171. STATIC : 'static';
  172. TEMPLATE : 'template';
  173. TRY : 'try';
  174. TUPLE : 'tuple';
  175. TYPE : 'type';
  176. USING : 'using';
  177. WHEN : 'when';
  178. WHILE : 'while';
  179. XOR : 'xor';
  180. AND : 'and';
  181. VARIABLE : 'var';
  182. ADDR : 'addr';
  183. AS : 'as';
  184. ASM : 'asm';
  185. BIND : 'bind';
  186. BLOCK : 'block';
  187. BREAK : 'break';
  188. CASE : 'case';
  189. CONCEPT : 'concept';
  190. CONST : 'const';
  191. CONTINUE : 'continue';
  192. CONVERTER : 'converter';
  193. DEFER : 'defer';
  194. DISCARD : 'discard';
  195. DISTINCT : 'distinct';
  196. DIV : 'div';
  197. DO : 'do';
  198. ELIF : 'elif';
  199. ELSE : 'else';
  200. END : 'end';
  201. ENUM : 'enum';
  202. EXCEPT : 'except';
  203. EXPORT : 'export';
  204. FINALLY : 'finally';
  205. FOR : 'for';
  206. FROM : 'from';
  207. FUNC : 'func';
  208. IF : 'if';
  209. IMPORT : 'import';
  210. IN : 'in';
  211. YIELD : 'yield';
  212. ASSERT : 'assert';
  213. ECHO : 'echo';
  214. GRAVE_ACCENT : '`';
  215. IDENTIFIER : [a-zA-Z]+ [0-9]* ( '_' ([a-zA-Z] | [0-9]) )*;
  216. NUMBER_LIT : INT_LIT | INT8_LIT | INT16_LIT | INT32_LIT | INT64_LIT | UINT_LIT | UINT8_LIT | UINT16_LIT | UINT32_LIT | UINT64_LIT | FLOAT_LIT | FLOAT32_LIT | FLOAT64_LIT;
  217. INT_LIT : HEX_LIT | DEC_LIT | OCT_LIT | BIN_LIT;
  218. DEC_LIT : DIGIT+ ( '_' DIGIT+ )*;
  219. BIN_LIT : '0' ('b' | 'B' ) BINDIGIT+ ( [_] BINDIGIT+ )*;
  220. HEX_LIT : '0' ('x' | 'X' ) HEXDIGIT+ ( '_' HEXDIGIT+ )*;
  221. OCT_LIT : '0o' OCTDIGIT+ ( '_' OCTDIGIT )*;
  222. INT8_LIT : INT_LIT ('\'') ('i' | 'I') '8';
  223. INT16_LIT : INT_LIT ('\'') ('i' | 'I') '16';
  224. INT32_LIT : INT_LIT ('\'') ('i' | 'I') '32';
  225. INT64_LIT : INT_LIT ('\'') ('i' | 'I') '64';
  226. UINT_LIT : INT_LIT ('\'') ('u' | 'U');
  227. UINT8_LIT : INT_LIT ('\'') ('u' | 'U') '8';
  228. UINT16_LIT : INT_LIT ('\'') ('u' | 'U') '16';
  229. UINT32_LIT : INT_LIT ('\'') ('u' | 'U') '32';
  230. UINT64_LIT : INT_LIT ('\'') ('u' | 'U') '64';
  231. EXPONENT : ('e' | 'E' ) ('+' | '-') DIGIT+ ( '_' DIGIT+ )*;
  232. FLOAT_LIT : DIGIT ('_' DIGIT+)* (('.' DIGIT+ ('_' DIGIT+)* (EXPONENT)*) |EXPONENT);
  233. FLOAT32_SUFFIX : ('f' | 'F') '32';
  234. FLOAT32_LIT : HEX_LIT '\'' FLOAT32_SUFFIX | (FLOAT_LIT | DEC_LIT | OCT_LIT | BIN_LIT) ('\'') FLOAT32_SUFFIX;
  235. FLOAT64_SUFFIX : ( ('f' | 'F') '64' ) | 'd' | 'D';
  236. FLOAT64_LIT : HEX_LIT '\'' FLOAT64_SUFFIX | (FLOAT_LIT | DEC_LIT | OCT_LIT | BIN_LIT) ('\'') FLOAT64_SUFFIX;
  237. RANGE : '..' (LESS_THAN?);
  238. EQUALS : '=';
  239. COMP_OPERATOR : GREATER_THAN | LESS_THAN | ((GREATER_THAN | LESS_THAN)? EQUALS) | EQUALS_OPERATOR;
  240. EQUALS_OPERATOR : EQUALS EQUALS;
  241. ADD_OPERATOR : '+';
  242. MUL_OPERATOR : '*';
  243. DIGIT : [0-9];
  244. LETTER : [a-zA-Z];
  245. HEXDIGIT : DIGIT | [a-fA-F];
  246. OCTDIGIT : [0-7];
  247. BINDIGIT : [0-1];
  248.  
  249. DOLLAR_OPERATOR : '$';
  250. MINUS_OPERATOR : '-';
  251. DIV_OPERATOR : '/';
  252. BITWISE_NOT_OPERATOR : '~';
  253. AND_OPERATOR : '&';
  254. OR_OPERATOR : '|';
  255. LESS_THAN : '<';
  256. GREATER_THAN : '>';
  257. AT_OPERATOR : '@';
  258. MODULUS : '%';
  259. NOT_OPERATOR : '!';
  260. XOR_OPERATOR : '^';
  261. DOT : '.';
  262. COLON : ':';
  263. OPEN_PAREN : '(';
  264. CLOSE_PAREN : ')';
  265. OPEN_BRACE : '{';
  266. CLOSE_BRACE : '}';
  267. OPEN_BRACK : '[';
  268. CLOSE_BRACK : ']';
  269. COMMA : ',';
  270. SEMI_COLON : ';';
  271. STR_LIT : '"'.*?'"';
  272. CHAR_LIT : '\''([a-zA-Z] | '[' | ']'
  273. |'\\'('r'
  274. |'c'
  275. |'n'
  276. |'l'
  277. |'f'
  278. |'t'
  279. |'v'
  280. |'\\'
  281. |'"'
  282. |'\''
  283. |DIGIT+
  284. |'a'
  285. |'b'
  286. |'e'
  287. |'x 'HEXDIGIT HEXDIGIT))'\'';
  288. TRIPLESTR_LIT : '"""'.*?'"""';
  289. RSTR_LIT : 'r''"'.*?'"';
  290. GENERALIZED_STR_LIT : [a-zA-Z]+ STR_LIT;
  291. GENERALIZED_TRIPLESTR_LIT : [a-zA-Z]+ TRIPLESTR_LIT;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement