Facebook
From Wet Agouti, 3 Years ago, written in Plain Text.
Embed
Download Paste or View Raw
Hits: 52
  1. %{
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include "y.tab.h"
  6.  
  7. int yylex (void);
  8. void yyerror(char* s);
  9.  
  10. is_program* myprogram;
  11.  
  12. %}
  13.  
  14. %token CHAR ELSE WHILE IF INT SHORT DOUBLE RETURN BITWISEAND BITWISEOR BITWISXOR AND ASSIGN MUL COMMA DIV EQ GE GT LBRACE LE LPAR LT MINUS MOD NE NOT OR PLUS RBRACE RPAR SEMI RESERVED
  15. %token <id> ID
  16. %token <id> CHRLIT
  17. %token <id> INTLIT
  18. %token <id> REALLIT
  19. %token <type_id> VOID
  20.  
  21.  
  22. %token<id>IDENTIFIER
  23. %type<ip>program
  24. %type<ivl>vardeclist
  25. %type<iv>vardec
  26. %type<isl>statementlist
  27. %type<is>statement
  28.  
  29. %type <statement> Statement
  30. %type <statement> Statement_Optional
  31.  
  32. %type <expression> Expr
  33. %type <expression> ExprAritmetic
  34. %type <expression> ExprComparison
  35. %type <expression> ExprBitwise
  36. %type <expression> ExprUnary
  37. %type <expression> Expr_Optional
  38.  
  39. %union{
  40.     char *id;
  41.     is_program* ip;
  42.  
  43.     double value_reallit;
  44.     bool value_boollit;
  45.     disc_type_id type_id;
  46.     is_program *program_union;
  47.  
  48.     is_expression *expression;
  49.     is_expression_list *expression_list;
  50.  
  51.     is_class_body_list *class_body_list;
  52.     is_class_body *class_body;
  53.  
  54.     is_comma_id *comma_id;
  55.     is_comma_type_id *comma_type_id;
  56.  
  57.     is_method_header *method_header;
  58.     is_method_body *method_body;
  59.     is_method_params *method_params;
  60.     is_method_body_list *method_body_list;
  61.  
  62.     is_statement *statement;
  63.     is_statement_call *call;
  64.     is_statement_parse_args *parse_args;
  65.     is_statement_assignment *assignment;
  66. }
  67.  
  68.  
  69. %right ASSIGN
  70. %left OR
  71. %left AND
  72. %left BITWISEXOR
  73. %left BITWISEOR
  74. %left BITWISEAND
  75. %left EQ NE
  76. %left LT LE GT GE
  77. %left PLUS MINUS
  78. %left MOD DIV MUL
  79. %right NOT
  80. %left "unario"
  81. %left LBRACE LPAR RBRACE RPAR
  82.  
  83. %nonassoc "then"
  84. %nonassoc ELSE
  85.  
  86. %%
  87.  
  88. FunctionsAndDeclarations
  89.     : FunctionDefinition FunctionsAndDeclarations_Optional                  {}
  90.     | FunctionDeclaration FunctionsAndDeclarations_Optional                 {}
  91.     | Declaration FunctionsAndDeclarations_Optional                         {}
  92.     ;
  93.  
  94. FunctionsAndDeclarations_Optional
  95.     : FunctionsAndDeclarations_Optional FunctionDefinition {}
  96.     | FunctionsAndDeclarations_Optional FunctionDeclaration                         {}
  97.     | FunctionsAndDeclarations_Optional Declaration                                 {}                  
  98.     | /*empty*/                                                                     {$$ = NULL;}
  99.     ;
  100.  
  101. FunctionDefinition
  102.     : TypeSpec FunctionDeclarator FunctionBody  {}
  103.     ;
  104.  
  105. FunctionBody
  106.     : LBRACE RBRACE {}
  107.     | LBRACE DeclarationsAndStatements RBRACE               {}
  108.     ;
  109.  
  110. DeclarationsAndStatements
  111.     : Statement DeclarationsAndStatements                   {}
  112.     | Declaration DeclarationsAndStatements                 {}
  113.     | Statement                                             {}
  114.     | Declaration                                           {}
  115.     ;
  116.  
  117. FunctionDeclaration
  118.     : TypeSpec FunctionDeclarator SEMI {}
  119.     ;
  120.  
  121.  
  122. FunctionDeclarator
  123.     : ID LPAR ParameterList RPAR                  {}
  124.     ;
  125.  
  126. ParameterList
  127.     : ParameterDeclaration ParameterList_Optional      {}
  128.     ;
  129.  
  130. ParameterList_Optional
  131.     :  ParameterList_Optional COMMA ParameterDeclaration        {}
  132.     | /*empty*/                                                 {$$ = NULL;}                                                    {$$ = NULL;}
  133.     ;
  134.  
  135. ParameterDeclaration
  136.     : TypeSpec                  {}
  137.     | TypeSpec ID               {}
  138.     ;
  139.  
  140. Declaration
  141.     : TypeSpec Declarator Declaration_Optional SEMI          {}
  142.     ;
  143.  
  144. Declaration_Optional
  145.     :  Declaration_Optional COMMA Declarator            {}
  146.     | /*empty*/                                         {$$ = NULL;}
  147.     ;
  148.  
  149. TypeSpec
  150.     : CHAR      {}
  151.     | INT       {}
  152.     | VOID      {}
  153.     | SHORT     {}
  154.     | DOUBLE    {}
  155.     ;
  156.  
  157. Declarator
  158.     : ID                                            {}
  159.     | ID ASSIGN Expr                                {}
  160.     ;
  161.  
  162. Statement
  163.     : LBRACE Statement_Optional RBRACE              {}
  164.     | SEMI                                          {}
  165.     | Expr SEMI                                     {}
  166.     | IF LPAR Expr RPAR Statement                   {}
  167.     | IF LPAR Expr RPAR Statement ELSE Statement    {}
  168.     | RETURN SEMI                                   {}
  169.     | RETURN Expr SEMI                              {}
  170.     | WHILE LPAR Expr RPAR Statement                {}
  171.     ;
  172.  
  173. Statement_Optional
  174.     : Statement_Optional Statement                  {}
  175.     | /*empty*/                                     {$$ = NULL;}
  176.     ;
  177.  
  178.  
  179. Expr
  180.     :  Expr COMMA Expr                  {}
  181.     | Expr ASSIGN Expr                  {}
  182.     | ExprAritmetic                     {$$ = $1;}
  183.     | ExprComparison                    {$$ = $1;}
  184.     | ExprBitwise                       {$$ = $1;}
  185.     | ExprUnary                         {$$ = $1;}
  186.     | LPAR Expr RPAR                    {}
  187.     | ID LPar Expr Expr_Optional RPAR   {$$ = insert_expression_comma($1);}
  188.     | ID LPar RPAR                      {$$ = insert_expression_comma($1);}
  189.     | ID                                {$$ = insert_expression_id($1);}
  190.     | INTLIT                            {$$ = insert_expression_intlit($1);}
  191.     | CHRLIT                            {$$ = insert_expression_chrlit($1);}
  192.     | REALLIT                           {$$ = insert_expression_reallit($1);}
  193.     ;
  194.  
  195. Expr_Optional
  196.     :  Expr_Optional COMMA Expr    {}
  197.     | /*empty*/                         {$$ = NULL;}
  198.     ;
  199.  
  200. ExprAritmetic
  201.     : Expr PLUS Expr                {$$ = insert_expression_add($1, $3);}
  202.     | Expr MINUS Expr               {$$ = insert_expression_sub($1, $3);}
  203.     | Expr MUL Expr                 {$$ = insert_expression_mul($1, $3);}
  204.     | Expr DIV Expr                 {$$ = insert_expression_div($1, $3);}
  205.     | Expr MOD Expr                 {$$ = insert_expression_mod($1, $3);}
  206.     ;
  207.  
  208. ExprComparison
  209.     :  Expr EQ Expr                 {$$ = insert_expression_eq($1, $3);}
  210.     |  Expr GE Expr                 {$$ = insert_expression_ge($1, $3);}
  211.     |  Expr GT Expr                 {$$ = insert_expression_gt($1, $3);}
  212.     |  Expr LE Expr                 {$$ = insert_expression_le($1, $3);}
  213.     |  Expr LT Expr                 {$$ = insert_expression_lt($1, $3);}
  214.     |  Expr NE Expr                 {$$ = insert_expression_ne($1, $3);}
  215.     ;
  216.  
  217. ExprBitwise
  218.     : Expr AND Expr                 {$$ = insert_expression_and($1, $3);}
  219.     | Expr OR Expr                  {$$ = insert_expression_or($1, $3);}
  220.     | Expr BITWISEXOR Expr          {$$ = insert_expression_bitwisexor($1, $3);}
  221.     | Expr BITWISEAND Expr          {$$ = insert_expression_bitwiseand($1, $3);}
  222.     | Expr BITWISEOR Expr           {$$ = insert_expression_bitwiseor($1, $3);}
  223.     ;
  224.  
  225. ExprUnary
  226.     : MINUS Expr      %prec "unario"      {$$ = insert_expression_minus($2);}
  227.     | NOT Expr                                  {$$ = insert_expression_not($2);}
  228.     | PLUS Expr     %prec "unario"              {$$ = insert_expression_plus($2);}
  229.     ;
  230.  
  231.  
  232. %%
  233.  
  234. void yyerror(char *msg) {
  235.     printf("%s", msg);
  236. }