Advertisement
Guest User

pl0yacc.ypp

a guest
Apr 30th, 2012
407
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.24 KB | None | 0 0
  1. %{
  2. #include <stdio.h>
  3.  
  4. int yylex(void);
  5. void yyerror(char *);
  6. /* To construct a structure to help in error reporting. It is
  7. automatically managed by bison.
  8. */
  9.  
  10.  
  11. typedef struct YYLTYPE
  12. {
  13. int first_line;
  14. int first_column;
  15. int last_line;
  16. int last_column;
  17. } YYLTYPE;
  18.  
  19. # define YYLTYPE_IS_DECLARED 1 /* alert the parser that we have our own definition*/
  20. %}
  21.  
  22. %union {
  23. char* str;
  24. int num;
  25. }
  26.  
  27. %locations
  28. %token ASSIGNMENT DIVIDE MULTIPLY ADD SUB
  29. %token RB LB GE LE NE EQ GT LT COMMA
  30. %token DOT SEMICOLON BEGN CALL CONST DO
  31. %token END IF ODD PROCEDURE THEN VAR WHILE
  32.  
  33. %token <num> NUMBER
  34. %token <str> ID
  35.  
  36. %%
  37.  
  38. program : block DOT {printf("program rule\n");}
  39. ;
  40.  
  41. block : const_decl var_decl proc_decl statement {printf("block rule\n");}
  42. ;
  43.  
  44. const_decl : CONST seq_assign SEMICOLON {printf("const_decl rule\n");}
  45. | {printf("const-decl rule empty\n");}
  46. ;
  47.  
  48. seq_assign : seq_assign COMMA ID EQ NUMBER {printf("seq_assign rule recursive\n");}
  49. | ID EQ NUMBER {printf("seq_assign rule non-recursive\n");}
  50. ;
  51.  
  52. var_decl : VAR seq_decl SEMICOLON {printf("var_decl rule\n");}
  53. | {printf("var_decl rule empty\n");}
  54. ;
  55.  
  56. seq_decl : seq_decl COMMA ID {printf("seq_decl rule recursive\n");}
  57. |ID {printf("seq_decl rule non-recursive\n");}
  58. ;
  59.  
  60. proc_decl : proc_decl PROCEDURE ID SEMICOLON block SEMICOLON {printf("proc_decl rule recursive\n");}
  61. | {printf("proc_decl rule empty\n");}
  62. ;
  63.  
  64. statement : ID ASSIGNMENT expression {printf("statement assignment rule\n");}
  65. | CALL ID {printf("statement call rule\n");}
  66. | BEGN seq_stmt END {printf("statement begin end rule\n");}
  67. | WHILE condition DO statement {printf("statement while rule\n");}
  68. | IF condition THEN statement {printf("statement if rule\n");}
  69. | {printf("statement empty rule\n");}
  70. ;
  71. seq_stmt : seq_stmt SEMICOLON statement {printf("seq_stmt rule recursive\n");}
  72. | statement {printf("seq_stmt rule non-recursive\n");}
  73. ;
  74.  
  75. expression : term seq_term {printf("expression rule 1\n");}
  76. | sterm seq_term {printf("expression rule 2\n");}
  77. ;
  78.  
  79. sterm : ADD term {printf("add term rule\n");}
  80. | SUB term {printf("sub term rule\n");}
  81. ;
  82.  
  83. seq_term : seq_term sterm {printf("seq_term recursive rule\n");}
  84. | {printf("seq_term rule empty\n");}
  85. ;
  86.  
  87. condition : ODD expression {printf("condition ODD\n");}
  88. | expression GE expression {printf("condition GE\n");}
  89. | expression LE expression {printf("condition LE\n");}
  90. | expression GT expression {printf("condition GT\n");}
  91. | expression LT expression {printf("condition LT\n");}
  92. | expression NE expression {printf("condition NE\n");}
  93. | expression EQ expression {printf("condition EQ\n");}
  94. ;
  95.  
  96. term : factor seq_factor {printf("term rule\n");}
  97. ;
  98.  
  99. seq_factor : seq_factor MULTIPLY factor {printf("seq_factor rule MUL recursive\n");}
  100. |seq_factor DIVIDE factor {printf("seq_factor rule DIV recursive\n");}
  101. | {printf("seq_factor rule empty\n");}
  102. ;
  103.  
  104. factor : ID {printf("ID found: %s\n",yylval.str);}
  105. | NUMBER {printf("NUMBER found\n");}
  106. | LB expression RB {printf("parenthesized expression found\n");}
  107. ;
  108.  
  109. %%
  110.  
  111. void
  112. yyerror(char *s, ...)
  113. {
  114. va_list ap;
  115. va_start(ap, s);
  116.  
  117. if(yylloc.first_line)
  118. fprintf(stderr, "%d.%d-%d.%d: error: ", yylloc.first_line, yylloc.first_column,
  119. yylloc.last_line, yylloc.last_column);
  120. vfprintf(stderr, s, ap);
  121. fprintf(stderr, "\n");
  122.  
  123. }
  124.  
  125. void
  126. lyyerror(YYLTYPE t, char *s, ...)
  127. {
  128. va_list ap;
  129. va_start(ap, s);
  130.  
  131. if(t.first_line)
  132. fprintf(stderr, "%d.%d-%d.%d: error: ", t.first_line, t.first_column,
  133. t.last_line, t.last_column);
  134. vfprintf(stderr, s, ap);
  135. fprintf(stderr, "\n");
  136. }
  137.  
  138. int main() {
  139. return yyparse();
  140. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement