Advertisement
claukiller

Untitled

Feb 28th, 2017
103
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.02 KB | None | 0 0
  1. %{
  2. // * Java declarations
  3. // This code is copied in the beginning of the generated Java file
  4. import scanner.Scanner;
  5. %}
  6.  
  7. // * Yacc declarations
  8. // Token definition
  9. %token INT_CONSTANT CHAR_CONSTANT REAL_CONSTANT
  10. %token INT DOUBLE CHAR VOID STRUCT
  11. %token ID IF ELSE
  12. %token MAIN RETURN WHILE READ WRITE
  13. %token AND OR
  14. %token EQUALS GREATEREQUAL LOWEREQUAL DISTINCT INCREMENT
  15.  
  16. //lower precedence
  17.  
  18. %right '='
  19. %left AND OR '!'
  20. %left '>' '<' EQUALS DISTINCT GREATEREQUAL LOWEREQUAL
  21. %left '+' '-'
  22. %left '*' '/' '%'
  23. %right UNARY_MINUS
  24. %nonassoc '(' ')'
  25. %nonassoc '[' ']'
  26. %nonassoc '.'
  27. %right THEN ELSE
  28.  
  29. %%
  30. // * Actions
  31.  
  32. program: varDef program
  33. | functionDef program
  34. | VOID MAIN '('')' '{' varDefs statements '}'
  35. ;
  36.  
  37. functionDef: type ID '(' params ')' '{' varDefs statements '}'
  38. | VOID ID '(' params ')' '{' varDefs statements '}'
  39. ;
  40.  
  41. varDefs: varDef varDefs
  42. | /* empty */
  43. ;
  44.  
  45. varDef: type listIDs ';'
  46. ;
  47.  
  48. type: INT
  49. | DOUBLE
  50. | CHAR
  51. | structConstructor
  52. | type '[' INT_CONSTANT ']'
  53. ;
  54.  
  55. structConstructor: STRUCT '{' varDefs '}' ;
  56.  
  57. listIDs: listIDs ',' ID
  58. | ID
  59. ;
  60.  
  61. params:
  62. | listOfParams
  63. ;
  64.  
  65. listOfParams: listOfParams ',' type ID
  66. | type ID
  67. ;
  68.  
  69. statements: statements statement
  70. | /* empty */
  71. ;
  72.  
  73. statement: assignment
  74. | returnStatement
  75. | ID '.' ID '=' expression ';'
  76. | ID arrayConstructor '=' expression ';'
  77. | writeStatement ';'
  78. | readStatement ';'
  79. | ifElseStatement ';'
  80. | whileStatement
  81. | functionInvocation ';'
  82. ;
  83.  
  84. ifElseStatement: IF '(' expression ')' statement;
  85.  
  86. functionInvocation: ID '(' expressions ')'
  87. ;
  88.  
  89. expressions: expression expressionAux
  90. | /* empty */
  91. ;
  92.  
  93. expressionAux: ',' expression expressionAux
  94. | /* empty */
  95. ;
  96.  
  97. arrayConstructor :'['expression']' arrayConstructor
  98. | '['expression']'
  99. ;
  100.  
  101.  
  102. writeStatement: WRITE expressions
  103. ;
  104.  
  105. readStatement: READ expressions
  106. ;
  107.  
  108. returnStatement: RETURN expression ';'
  109.  
  110. whileStatement: WHILE '(' expression ')' '{' statements '}'
  111. ;
  112.  
  113. cast: '(' type ')' expression
  114. ;
  115.  
  116. expression: expression '+' expression
  117. | expression '*' expression
  118. | expression '-' expression
  119. | expression '/' expression
  120. | expression '%' expression
  121. | expression '>' expression
  122. | expression '<' expression
  123. | '-' expression %prec UNARY_MINUS
  124. | '!' expression
  125. | expression AND expression
  126. | expression OR expression
  127. | expression EQUALS expression
  128. | expression GREATEREQUAL expression
  129. | expression LOWEREQUAL expression
  130. | expression DISTINCT expression
  131. | cast
  132. | INT_CONSTANT
  133. | CHAR_CONSTANT
  134. | REAL_CONSTANT
  135. | ID
  136. | '(' expression ')'
  137. | functionInvocation
  138. | returnStatement
  139. ;
  140.  
  141. assignment: expression '=' expression ';'
  142.  
  143.  
  144. %%
  145.  
  146. // * Code
  147. // Members of the generated Parser class
  148. // We must implement at least:
  149. // - int yylex()
  150. // - void yyerror(String)
  151.  
  152. // * Lexical analyzer
  153. private Scanner scanner;
  154.  
  155. // * Root node of the tree
  156. private ASTNode astRootNode;
  157.  
  158. // * Invocation to the scanner
  159. private int yylex () {
  160. int token=0;
  161. try {
  162. token=scanner.yylex();
  163. this.yylval = scanner.getYylval();
  164. } catch(Throwable e) {
  165. System.err.println ("Lexical error in line " + scanner.getLine()+
  166. " and column "+scanner.getColumn()+":\n\t"+e);
  167. }
  168. return token;
  169. }
  170.  
  171. // * Syntax error handler
  172. public void yyerror (String error) {
  173. System.err.println ("Syntax error in line " + scanner.getLine()+
  174. " and column "+scanner.getColumn()+":\n\t"+error );
  175. Token lastToken = (Token) yyval;
  176. System.err.println ("Token" + lastToken.getToken() + "lexema "
  177. + lastToken.getLexeme() + " start " + lastToken.getStart());
  178.  
  179. }
  180.  
  181. // * Constructor
  182. public Parser(Scanner scanner) {
  183. this.scanner= scanner;
  184. //this.yydebug = true;
  185. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement