Guest User

Untitled

a guest
Nov 25th, 2017
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.73 KB | None | 0 0
  1. /*
  2. * parser.cup -- SPL parser specification
  3. */
  4.  
  5. package parse;
  6.  
  7. import java_cup.runtime.*;
  8. import absyn.*;
  9. import sym.*;
  10.  
  11. parser code {:
  12.  
  13. public void syntax_error(Symbol currToken) {
  14. System.out.println(
  15. "**** Error: syntax error" +
  16. " in line " + currToken.left +
  17. ", column " + currToken.right
  18. );
  19. System.exit(0);
  20. }
  21. :}
  22.  
  23. /* Terminals (tokens returned by lexer). */
  24.  
  25. terminal LPAREN, RPAREN, LBRACK, RBRACK, LCURL, RCURL;
  26. terminal EQ, NE, LT, LE, GT, GE;
  27. terminal ASGN, COLON, COMMA, SEMIC;
  28. terminal PLUS, MINUS, STAR, SLASH;
  29. terminal String IDENT;
  30. terminal Integer INTLIT;
  31. terminal WHILE, ELSE, OF, IF, ARRAY, PROC, REF, TYPE, VAR;
  32.  
  33. /*non terminals*/
  34.  
  35. non terminal DecList program, typoderProcDef, parameterListe, varDeks, funkSignatur;
  36. non terminal TypeDec typDef;
  37. non terminal ExpList argumentenListe, argument;
  38. non terminal ParDec parameter;
  39. non terminal ProcDec procDef;
  40. non terminal VarDec varDeklaration;
  41. non terminal StmList anweisungen;
  42. non terminal Stm anweisung, funkAufruf, elif, schleife, zuweisung, folge, optElse;
  43. non terminal Exp ausdruck, bedingung, faktor, term, uminus;
  44. non terminal Ty feldTyp;
  45. non terminal Var einfachVar, feldVar, variable, konstVar;
  46. non terminal Integer verglOp;
  47.  
  48. /* Startzeichen*/
  49.  
  50. start with program;
  51.  
  52. /*Regeln*/
  53. program ::= typoderProcDef:e1 program:e2
  54. {: RESULT = new DecList(e1, e2); :}
  55. | typoderProcDef:e3
  56. {: RESULT = new DecList(e3, new DecList()); :};
  57.  
  58. typoderProcDef ::= typDef:e1
  59. {: RESULT = e1; :}
  60. | procDef:e2
  61. {: RESULT = e2; :};
  62.  
  63. typDef ::= TYPE:t IDENT:e1 EQ feldTyp:e2 SEMIC
  64. {: RESULT = new TypeDec(tleft, tright, e1, e2); :};
  65.  
  66. procDef ::= PROC:p IDENT:e1 funkSignatur:e2 LCURL varDeks:e3 anweisungen:e4 RCURL
  67. {: RESULT = new ProcDec(pleft, pright, newSym(e1), e2, e3, e4); :};
  68.  
  69. feldTyp ::= IDENT:e1
  70. {: RESULT = new NameTy(e1left, e1right, newSym(e1); :}
  71. | ARRAY:a LBRACK ausdruck:e2 RBRACK OF feldTyp:e3
  72. {: RESULT = new ArrayTy(aleft, aright, e2, e3); :};
  73.  
  74. funkSignatur ::= LPAREN parameterListe:e1 RPAREN
  75. {: RESULT = e1; :};
  76.  
  77. parameterListe ::= parameter:e1
  78. {: RESULT = e1; :}
  79. | parameter:e1 COMMA parameterListe:e2
  80. {: RESULT = new DecList(e1, e2); :}
  81. |
  82. {: RESULT = new DecList(); :};
  83.  
  84. parameter ::= IDENT:e1 COLON IDENT:e2
  85. {: RESULT = new ParDec(e1left, e1right, e1,, e2 false); :}
  86. | REF:r IDENT:e1 COLON IDENT:e2
  87. {: RESULT = new ParDec(rleft, rright, e1, e2, true); :};
  88.  
  89. varDeks ::= varDeklaration:e1 varDeks:e2
  90. {: RESULT = new DecList(e1, e2); :};
  91.  
  92. varDeklaration ::= VAR:v IDENT:e1 COLON feldTyp:e2 SEMIC
  93. {: RESULT = new VarDec(vleft, vright, newSym(e1), e2); :};
  94.  
  95. anweisungen ::= anweisung:e1 anweisungen:e2
  96. {: RESULT = new StmList(e1, e2); :}
  97. |
  98. {: RESULT = new StmList(); :};
  99.  
  100. anweisung ::= zuweisung:e1
  101. {: RESULT = e1; :}
  102. | funkAufruf:e1
  103. {: RESULT = e1; :}
  104. | schleife:e1
  105. {: RESULT = e1; :}
  106. | elif:e1
  107. {: RESULT = e1; :}
  108. | folge:e1
  109. {: RESULT = e1; :}
  110. | SEMIC:e1
  111. {: RESULT = new EmptyStm(e1left, e1right); :};
  112.  
  113. funkAufruf ::= IDENT:e1 LPAREN argumentenListe:e2 RPAREN SEMIC
  114. {: RESULT = new CallStm(e1left, e1right, newSym(e1), e2); :};
  115.  
  116. folge ::= LCURL:l anweisungen:e1 RCURL
  117. {: RESULT = new CompStm(lleft, lright, e1); :};
  118.  
  119. argumentenListe ::= argument:e1
  120. {: RESULT = e1; :}
  121. |
  122. {: RESULT = new ExpList(); :};
  123.  
  124. argument ::= ausdruck:e1
  125. {: RESULT = new ExpList(e1, new ExpList()); :}
  126. | ausdruck:e1 COMMA argumentenListe:e2
  127. {: RESULT = new ExpList(e1, e2); :};
  128.  
  129. zuweisung ::= variable:e1 ASGN ausdruck:e2 SEMIC
  130. {: RESULT = new AssignStm(e1left, e1right, e1, e2); :};
  131.  
  132.  
  133.  
  134. ausdruck ::= ausdruck:e1 PLUS term:e2
  135. {: RESULT = new OpExp(e1left, e1right, OpExp.ADD, e1, e2 ); :}
  136.  
  137. | ausdruck:e1 MINUS term:e2
  138. {: RESULT = new OpExp(e1left, e1right, OpExp.SUB, e1, e2 ); :}
  139. | term:e1
  140. {: RESULT = e1; :};
  141.  
  142. term ::= term:e1 STAR uminus:e2
  143. {: RESULT = new OpExp(e1left, e1right, OpExp.MUL, e1, e2 ); :}
  144. | term:e1 SLASH uminus:e2
  145. {: RESULT = new OpExp(e1left, e1right, OpExp.DIV, e1, e2 ); :}
  146. | uminus:e1
  147. {: RESULT = e1; :};
  148.  
  149. uminus ::= MINUS faktor:e1
  150. {: RESULT = e1; :}
  151. | faktor:e1
  152. {: RESULT = e1; :};
  153.  
  154. faktor ::= konstante:e1
  155. {: RESULT = e1; :}
  156. | variale:e1
  157. {: RESULT = e1; :}
  158. | LPAREN ausdruck:e1 RPAREN
  159. {: RESULT = e1; :};
  160.  
  161. konstante INTLIT:e1
  162. {: RESULT = new IntExp(e1left, e1right, e1); :};
  163.  
  164. variable ::= einfachVar:e1
  165. {: RESULT = e1; :}
  166. | feldVar:e1
  167. {: RESULT = e1; :};
  168.  
  169. einfachVar ::= IDENT:e1
  170. {: RESULT = new VarExp(e1left, e1right, new SimpleVar(e1left, e1right, newSym(e1)); :};
  171.  
  172. feldVar ::= variable:v LBRACK ausdruck:e1 RBRACK
  173. {: RESULT = new ArrayVar(vleft, vright, v, e1); :};
  174.  
  175. elif ::= IF:i LPAREN bedingung:e1 RPAREN anweisung:e2 optElse:e3
  176. {: RESULT = new IfStm(ileft, iright, e1, e2, e3); :};
  177.  
  178. optElse ::= ELSE anweisung:e1
  179. {: RESULT = e1; :}
  180. |
  181. {: RESULT = null; :};
  182.  
  183. bedingung ::= ausdruck:e1 verglOp:e2 ausdruck:e3
  184. {: RESULT = new OpExp(e1left, e1right, e2, e1, e3 ); :}
  185. | ausdruck:e1
  186. {: RESULT = e1; :};
  187.  
  188. verglOp ::= EQ
  189. {: RESULT = OpExp.EQU; :}
  190. | NE
  191. {: RESULT = OpExp.NEQ; :}
  192. | LT
  193. {: RESULT = OpExp.LST; :}
  194. | LE
  195. {: RESULT = OpExp.LSE; :}
  196. | GT
  197. {: RESULT = OpExp.GRT; :}
  198. | GE
  199. {: RESULT = OpExp.GRE; :};
  200.  
  201. schleife ::= WHILE:w LPAREN bedingung:e1 RPAREN anweisung:e2
  202. {: RESULT = new WhileStm(wleft, wright, e1, e2); :};
Add Comment
Please, Sign In to add comment