Advertisement
minh_tran_782

MT22_TMT_AST.g4

Mar 16th, 2023
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.00 KB | None | 0 0
  1. //2012018
  2. grammar MT22;
  3.  
  4. @lexer::header {
  5. from lexererr import *
  6.  
  7. }
  8. @members{
  9.  
  10. }
  11. options{
  12. language=Python3;
  13. }
  14. // py run.py test ParserSuite
  15. // py run.py test LexerSuite
  16. // py run.py gen
  17. program: decllist EOF;
  18.  
  19. decllist: decl decllist | decl;
  20.  
  21. decl: vardecl | funcdecl;
  22.  
  23.  
  24. vardecl: varnoinit | varassign | array;
  25.  
  26.  
  27. varnoinit: idlist COLON vartype SEMI;
  28.  
  29. varassign: idlist COLON vartype EQ expprime SEMI;
  30. // basecase: ID COLON vartype EQ expr;
  31. // helper: ID COMMA helper COMMA expr | basecase;
  32. // py run.py test ASTGenSuite
  33. vartype: INTEGER | FLOAT | BOOLEAN | STRING | AUTO;
  34.  
  35.  
  36. atomic_type : INTEGER | FLOAT | BOOLEAN | STRING;
  37.  
  38. idlist: ID COMMA idlist | ID ;
  39.  
  40. /* Array Declaration */
  41. array: arraydecl | arrayinit;
  42. arraydecl: idlist COLON arrayParam SEMI;
  43. arrayinit: idlist COLON arrayParam EQ arraylit SEMI;
  44.  
  45. // arrayAccess: arrayAssign | arrayIndex;
  46. // arrayAssign: ID SQLB dimension SQRB EQ expr SEMI;
  47. // arrayIndex: ID SQLB dimension SQRB SEMI;
  48.  
  49. arraylit: ID | arrayVal;
  50. arrayVal: LCB exprlist RCB;
  51. arrayParam: ARR SQLB dimension SQRB OF atomic_type;
  52. dimension: INTLIT COMMA dimension | INTLIT;
  53.  
  54. /* Array Declaration */
  55.  
  56. funcdecl: base_funcdecl (PARAM_KEYWORDS ID| ) blockstmt;
  57. // funcdecl_inherit: base_funcdecl PARAM_KEYWORDS ID body;
  58. // funcdecl_noinherit: base_funcdecl body;
  59. base_funcdecl: ID COLON FUNCTION returntype LB paramlist RB;
  60. // inherit_id: PARAM_KEYWORDS ID;
  61. returntype: atomic_type | VOID | AUTO | arrayParam;
  62. // body: blockstmt;
  63.  
  64. paramlist: paramprime | ;
  65. paramprime: param COMMA paramprime | param;
  66. param: (paramHead | ) parambase;
  67. paramHead: PARAM_KEYWORDS (PARAM_KEYWORDS|);
  68. parambase: ID COLON paramtype;
  69. paramtype: atomic_type | AUTO | arrayParam;
  70. // stmtlist: stmt stmtlist | ;
  71. blocklist: allowed_blockstmt blocklist | ;
  72. /* Statement */
  73. stmt: assignstmt | ifstmt| returnstmt | callstmt | forstmt| whilestmt | dowhile_stmt | continuestmt |breakstmt | blockstmt;
  74. allowed_blockstmt: stmt | vardecl;
  75. assignstmt: scalar_variable EQ expr SEMI;
  76.  
  77. ifstmt: IF LB expr RB loopstmt (ELSE loopstmt | );
  78. // if_noelsestmt: ;
  79. // ifelsestmt: IF LB exprlist RB loopstmt ELSE loopstmt;
  80.  
  81. /* loop statement */
  82. forstmt: FOR LB scalar_variable EQ expr COMMA expr COMMA expr RB loopstmt;
  83. whilestmt: WHILE LB expr RB loopstmt;
  84. dowhile_stmt: DO blockstmt WHILE LB expr RB SEMI;
  85. /* loop statement */
  86. returnstmt: RETURN expr SEMI;
  87. callstmt: ID LB exprlist RB SEMI;
  88. continuestmt: CONTINUE SEMI;
  89. breakstmt: BREAK SEMI;
  90. blockstmt: LCB blocklist RCB;
  91. loopstmt: blockstmt | stmt;
  92. /* Statement */
  93.  
  94. scalar_variable: ID | indexop;
  95.  
  96.  
  97. /* expression list */
  98. exprlist: expprime | ;
  99. expprime: expr COMMA expprime | expr;
  100. expr: expr1 SCOPE expr1 | expr1;
  101. expr1: expr2 COMPARE expr2 | expr2;
  102. expr2: expr2 ANDOR expr3 | expr3;
  103. expr3: expr3 ADDSUB expr4 | expr4;
  104. expr4: expr4 MULDIVMOD expr5 | expr5;
  105. expr5: NOT expr5 | expr6;
  106. expr6: MINUS expr6 | expr7;
  107. expr7: BOOLLIT | INTLIT | STRINGLIT | FLOATLIT | ID | callexpr | subexpr | indexop;
  108. callexpr: ID LB exprlist RB;
  109. subexpr: LB expr RB;
  110. indexop: ID SQLB exprlist SQRB;
  111. /* expression list */
  112. /**************************************************** FRAGMENTS **********************************************/
  113.  
  114. fragment EXPPART: [eE] [-+]? [0-9]+;
  115. fragment DECPART: '.'[0-9]+;
  116. fragment StringChar: ~[\b\f\r\n\t"\\] | ESC2;
  117. fragment ESC2: '\\' [bfrnt"\\];
  118. fragment DOUBLEQ : '"';
  119. fragment IllegalString
  120. : '\\' ~[bfrnt"\\]
  121. | '\\'
  122. ;
  123.  
  124. /***************************************************** Lexer *************************************************/
  125. PARAM_KEYWORDS: INHERIT | OUT;
  126. BOOLLIT: TRUE | FALSE;
  127.  
  128. FLOATLIT: (INTLIT DECPART | INTLIT DECPART EXPPART | INTLIT EXPPART | DECPART EXPPART?) {self.text = self.text.replace('_', '')};
  129. /* 1. ; .e ; */
  130. INTLIT: '0' | [1-9] ('_'?[0-9])* {self.text = self.text.replace('_', '')};
  131.  
  132. STRINGLIT: DOUBLEQ (StringChar*) DOUBLEQ
  133. {
  134. result = str(self.text)
  135. self.text = result[1:-1]
  136. };
  137.  
  138. /* TYPE */
  139. INTEGER: 'integer';
  140. VOID: 'void';
  141. FLOAT: 'float';
  142. BOOLEAN: 'boolean';
  143. STRING: 'string';
  144. /* TYPE */
  145.  
  146. /* KEYWORD */
  147. AUTO: 'auto';
  148. OF: 'of';
  149. ARR : 'array';
  150. INHERIT: 'inherit';
  151. FUNCTION: 'function';
  152. IF: 'if';
  153. ELSE: 'else';
  154. BREAK: 'break';
  155. RETURN: 'return';
  156. OUT: 'out';
  157. FOR: 'for';
  158. CONTINUE: 'continue';
  159. DO: 'do';
  160. WHILE: 'while';
  161. TRUE: 'true';
  162. FALSE: 'false';
  163.  
  164. /* KEYWORDS */
  165.  
  166.  
  167. /* COMMENT */
  168. COMMENT: '//' ~[\r\n]* -> skip;
  169. C_COMMENT: '/*' .*? '*/' -> skip;
  170. /* COMMENT */
  171.  
  172. ID: [_a-zA-Z][_a-zA-Z0-9]*; // key word not check now (ass1)
  173.  
  174. /* SEPERATORS */
  175. LB : '(';
  176. RB: ')';
  177. SQLB: '[';
  178. SQRB: ']';
  179. DOT: '.';
  180. COMMA: ',';
  181. SEMI: ';';
  182. COLON: ':';
  183. LCB: '{';
  184. RCB: '}';
  185. /* SEPERATORS */
  186.  
  187. /*OPERATORS */
  188. ADDSUB: ADD | MINUS;
  189. MULDIVMOD: MUL | DIV | PCENT;
  190. ANDOR: AND | OR;
  191. COMPARE: SAME | NOTSAME | HIGHER | HIGHER_EQ | LOWER | LOWER_EQ;
  192. ADD: '+';
  193. MINUS: '-';
  194. MUL: '*';
  195. DIV: '/';
  196. PCENT: '%';
  197. NOT: '!';
  198. AND: '&&';
  199. OR: '||';
  200. SAME: '==';
  201. NOTSAME: '!=';
  202. LOWER: '<';
  203. HIGHER: '>';
  204. LOWER_EQ: '<=';
  205. HIGHER_EQ: '>=';
  206. SCOPE: '::';
  207. EQ: '=';
  208. /*OPERATORS */
  209.  
  210.  
  211. WS : [ \t\r\n]+ -> skip ;
  212.  
  213. /* ERROR HANDLING */
  214. //UNDERTERMINATED_COMMENT: '/*' .* (~[/*] | EOF) {raise UnterminatedComment(self.text[2:])};
  215. UNCLOSE_STRING: DOUBLEQ StringChar* ([\b\t\f\n\r"\\] | EOF)
  216. {
  217. unclose_str = str(self.text)
  218. possible = ['\b', '\t', '\f', '\n', '\r', '"', '\\']
  219. if unclose_str[-1] in possible:
  220. raise UncloseString(unclose_str[1:-1])
  221. else:
  222. raise UncloseString(unclose_str[1:])
  223. }
  224. ;
  225. ILLEGAL_ESCAPE:DOUBLEQ StringChar* IllegalString
  226. {
  227. illegal_str = str(self.text)
  228. raise IllegalEscape(illegal_str[1:])
  229. }
  230. ;
  231. ERROR_CHAR: .
  232. {
  233. raise ErrorToken(self.text)
  234. }
  235. ;
  236. /* ERROR HANDLING */
  237.  
  238. // py run.py test LexerSuite
  239. // py run.py gen
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement