Advertisement
Lupins

parser.y

Jan 11th, 2017
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.14 KB | None | 0 0
  1. %{
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4.  
  5. #define SYMTABSIZE      50
  6. #define IDLENGTH            15
  7. #define NOTHING             -1
  8. #define INDENTOFFSET    2
  9.  
  10. enum ParseTreeNodeType{PROGRAM, BLOCK};
  11.  
  12. #ifndef TRUE
  13. #define TRUE 1
  14. #endif
  15.  
  16. #ifndef FALSE
  17. #define FALSE 0
  18. #endif
  19.  
  20. #ifndef NULL
  21. #define NULL 0
  22. #endif
  23.  
  24. // PARSE TREE DEFINITION
  25. struct treeNode {
  26.     int item;
  27.     int nodeIdentifier;
  28.     struct treeNode *first;
  29.     struct treeNode *second;
  30.     struct treeNode *third;
  31. };
  32.  
  33. typedef struct treeNode TREE_NODE;
  34. typedef TREE_NODE *TERNARY_TREE;
  35.  
  36. TERNARY_TREE create_node(int, int, TERNARY_TREE, TERNARY_TREE, TERNARY_TREE);
  37.  
  38. // SYMBOL TABLE DEFINITION
  39. struct symTabNode{
  40.     char identifier[IDLENGTH];
  41. };
  42.  
  43. typedef struct symTabNode SYMTABNODE;
  44. typedef SYMTABNODE *SYMTABNODEPTR;
  45.  
  46. SYMTABNODEPTR symTab[SYMTABSIZE];
  47.  
  48. int currentSymTabSize = 0;
  49.  
  50. #include <ctype.h>
  51. #include <stdio.h>
  52. #define YYSTYPE double /*double type for Yacc stack*/
  53. extern int yylex();
  54. extern int yyparse();
  55. extern void yyerror(const char* s);
  56.  
  57. %}
  58.  
  59. // START SYMBOL
  60. %start Programa
  61.  
  62. // ACTION VALUE TYPES
  63. %union {
  64.     int iVal;
  65.     TERNARY_TREE    tVal;
  66. }
  67.  
  68. %token PROGRAMA CAR INT RETORNE LEIA ESCREVA NOVALINHA SE ENTAO SENAO ENQUANTO EXECUTE OU E IGUAL DIFERENTE MENOR MAIOR MAIORIGUAL MENORIGUAL MAIS MENOS VEZES DIVIDE MOD NAO RECEBE CARCONST ID INTCONST CADEIACAR ABREP FECHAP VIRGULA PONTOEV ABREC FECHAC ABRECH FECHACH DOISP INTER
  69.  
  70. %error-verbose
  71.  
  72. %%
  73. Programa    : DeclFuncVar DeclProg
  74.         ;
  75. DeclFuncVar : Tipo ID DeclVar PONTOEV DeclFuncVar
  76.         | Tipo ID ABREC INTCONST FECHAC DeclVar PONTOEV DeclFuncVar
  77.         | Tipo ID DeclFunc DeclFuncVar
  78.         | /* empty */
  79.         ;
  80. DeclProg    : PROGRAMA Bloco
  81.         ;
  82. DeclVar     : VIRGULA ID DeclVar
  83.         | VIRGULA ID ABREC INTCONST FECHAC DeclVar
  84.         | /* empty */
  85.         ;
  86. DeclFunc    :ABREP ListaParametros FECHAP Bloco
  87.         ;
  88. ListaParametros : /* empty */
  89.         | ListaParametrosCont
  90.         ;
  91. ListaParametrosCont : Tipo ID
  92.             | Tipo ID ABREC FECHAC
  93.             | Tipo ID VIRGULA ListaParametrosCont
  94.             | Tipo ID ABREC FECHAC VIRGULA ListaParametrosCont
  95.             ;
  96. Bloco       : ABRECH ListaDeclVar ListaComando FECHACH
  97.         | ABRECH ListaDeclVar FECHACH
  98.         ;
  99. ListaDeclVar    : /* empty */
  100.         | Tipo ID DeclVar PONTOEV ListaDeclVar
  101.         | Tipo ID ABREC INTCONST FECHAC DeclVar PONTOEV ListaDeclVar
  102.         ;
  103. Tipo        : INT
  104.         | CAR
  105.         ;
  106. ListaComando    : Comando
  107.         | Comando ListaComando
  108.         ;
  109. Comando     : PONTOEV
  110.         | Expr PONTOEV
  111.         | RETORNE Expr PONTOEV
  112.         | LEIA LValueExpr PONTOEV
  113.         | ESCREVA Expr PONTOEV
  114.         | ESCREVA CADEIACAR PONTOEV
  115.         | NOVALINHA PONTOEV
  116.         | SE ABREP Expr FECHAP ENTAO Comando
  117.         | SE ABREP Expr FECHAP ENTAO Comando SENAO Comando
  118.         | ENQUANTO ABREP Expr FECHAP EXECUTE Comando
  119.         | Bloco
  120.         ;
  121. Expr        : AssignExpr
  122.         ;
  123. AssignExpr  : CondExpr
  124.         | LValueExpr RECEBE AssignExpr
  125.         ;
  126. CondExpr    : OrExpr
  127.         | OrExpr INTER Expr DOISP CondExpr
  128.         ;
  129. OrExpr      : OrExpr OU AndExpr
  130.         | AndExpr
  131.         ;
  132. AndExpr     : AndExpr E EqExpr
  133.         | EqExpr
  134.         ;
  135. EqExpr      : EqExpr IGUAL DesigExpr
  136.         | EqExpr DIFERENTE DesigExpr
  137.         | DesigExpr
  138.         ;
  139. DesigExpr   : DesigExpr MENOR AddExpr
  140.         | DesigExpr MAIOR AddExpr
  141.         | DesigExpr MAIORIGUAL AddExpr
  142.         | DesigExpr MENORIGUAL AddExpr
  143.         | AddExpr
  144.         ;
  145. AddExpr     : AddExpr MAIS MulExpr
  146.         | AddExpr MENOS MulExpr
  147.         | MulExpr
  148.         ;
  149. MulExpr     : MulExpr VEZES UnExpr
  150.         | MulExpr DIVIDE UnExpr
  151.         | MulExpr MOD UnExpr
  152.         | UnExpr
  153.         ;
  154. UnExpr      : MENOS PrimExpr
  155.         | NAO PrimExpr
  156.         | PrimExpr
  157.         ;
  158. LValueExpr  : ID ABREC Expr FECHAC
  159.         | ID
  160.         ;
  161. PrimExpr    : ID ABREP ListExpr FECHAP
  162.         | ID ABREP FECHAP
  163.         | ID ABREC Expr FECHAC
  164.         | ID
  165.         | CARCONST
  166.         | INTCONST
  167.         | ABREP Expr FECHAP
  168.         ;
  169. ListExpr    : AssignExpr
  170.         | ListExpr VIRGULA AssignExpr
  171.         ;
  172.  
  173. %%
  174.  
  175. void yyerror(const char* errmsg)
  176. {
  177.     printf("\nERRO: %s\n", errmsg);
  178. }
  179.  
  180. int yywrap(void) { return 1; }
  181.  
  182. int main(int argc, char** argv)
  183. {
  184.     #if YYDEBUG == 1
  185.     extern int yydebug;
  186.     yydebug = 1;
  187.     #endif
  188.  
  189.   yyparse();
  190.   return 0;
  191. }
  192.  
  193. TERNARY_TREE create_node(int ival, int case_identifier, TERNARY_TREE p1, TERNARY_TREE p2, TERNARY_TREE p3)
  194. {
  195.     TERNARY_TREE t;
  196.     t = (TERNARY_TREE)malloc(sizeof(TREE_NODE));
  197.     t->item = ival;
  198.     t->nodeIdentifier = case_identifier;
  199.     t->first = p1;
  200.     t->second = p2;
  201.     t->third = p3;
  202.     return(t);
  203. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement