Advertisement
cd62131

z.y calculator parser

Dec 6th, 2018
492
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.16 KB | None | 0 0
  1. %{
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include "y.tab.h"
  5. #include "lex.yy.c"
  6. double symbolTable[4];
  7. double *arrayTable[4] = {NULL, NULL, NULL, NULL};
  8. int arraySize[4] = {0};
  9. void yyerror(char const *);
  10. %}
  11. %union{
  12.   int ival;
  13.   double dval;
  14. }
  15. %token <ival> ID ID2
  16. %token <dval> NUM
  17. %type <dval> Expr
  18. %token PRT DIM
  19. %left '+' '-'
  20. %left '/' '*' '%' QUO
  21. %start Program
  22. %%
  23. Program: Statement
  24.        | Program Statement
  25.        ;
  26. Statement: Assign ';'
  27.          | Print ';'
  28.          | Decl ';'
  29.          ;
  30. Assign: ID '=' Expr { symbolTable[$1] = $3; }
  31.       | ID2 '[' Expr ']' '=' Expr {
  32.             if (arraySize[$1] <= 0) {
  33.                 yyerror("no initialize.");
  34.             } else if ($3 < 0 || arraySize[$1] <= $3) {
  35.                 yyerror("index error.");
  36.             } else {
  37.                 arrayTable[$1][(int )$3] = $6;
  38.             }
  39.         }
  40.       ;
  41. Print: PRT Expr { printf("%f\n", $2); }
  42.      ;
  43. Decl: DIM ID2 '[' Expr ']' {
  44.           if (arraySize[$2] > 0) {
  45.               yyerror("almost declared.");
  46.           } else if ($4 < 0) {
  47.               yyerror("index error.");
  48.           } else {
  49.               int n = $4;
  50.               arraySize[$2] = n;
  51.               double *p = arrayTable[$2] = calloc(sizeof *p, n);
  52.               for (int i = 0; i < n; ++i) {
  53.                   p[i] = 0.;
  54.               }
  55.           }
  56.       }
  57.     ;
  58. Expr: Expr '+' Expr { $$ = $1 + $3; }
  59.     | Expr '-' Expr { $$ = $1 - $3; }
  60.     | Expr '*' Expr { $$ = $1 * $3; }
  61.     | Expr '/' Expr { $$ = $1 / $3; }
  62.     | Expr '%' Expr { $$ = (int )$1 % (int )$3; }
  63.     | Expr QUO Expr { $$ = (int )$1 / (int )$3;}
  64.     | '(' Expr ')' { $$ = $2; }
  65.     | NUM { $$ = $1; }
  66.     | ID { $$ = symbolTable[$1]; }
  67.     | ID2 '[' Expr ']' {
  68.           if (arraySize[$1] <= 0) {
  69.               yyerror("no initialize.");
  70.               $$ = 0.;
  71.           } else if ($3 < 0 || arraySize[$1] <= $3) {
  72.               yyerror("index error.");
  73.               $$ = 0.;
  74.           } else {
  75.               $$ = arrayTable[$1][(int )$3];
  76.           }
  77.       }
  78.     ;
  79. %%
  80. int main(void){
  81.     yyparse();
  82. }
  83. void yyerror(char const *msg) {
  84.     fprintf(stderr, "error: %s\n", msg);
  85. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement