Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- %{
- #include <stdio.h>
- #include <stdlib.h>
- #define SYMTABSIZE 50
- #define IDLENGTH 15
- #define NOTHING -1
- #define INDENTOFFSET 2
- enum ParseTreeNodeType{PROGRAM, BLOCK};
- #ifndef TRUE
- #define TRUE 1
- #endif
- #ifndef FALSE
- #define FALSE 0
- #endif
- #ifndef NULL
- #define NULL 0
- #endif
- // PARSE TREE DEFINITION
- struct treeNode {
- int item;
- int nodeIdentifier;
- struct treeNode *first;
- struct treeNode *second;
- struct treeNode *third;
- };
- typedef struct treeNode TREE_NODE;
- typedef TREE_NODE *TERNARY_TREE;
- TERNARY_TREE create_node(int, int, TERNARY_TREE, TERNARY_TREE, TERNARY_TREE);
- // SYMBOL TABLE DEFINITION
- struct symTabNode{
- char identifier[IDLENGTH];
- };
- typedef struct symTabNode SYMTABNODE;
- typedef SYMTABNODE *SYMTABNODEPTR;
- SYMTABNODEPTR symTab[SYMTABSIZE];
- int currentSymTabSize = 0;
- #include <ctype.h>
- #include <stdio.h>
- #define YYSTYPE double /*double type for Yacc stack*/
- extern int yylex();
- extern int yyparse();
- extern void yyerror(const char* s);
- %}
- // START SYMBOL
- %start Programa
- // ACTION VALUE TYPES
- %union {
- int iVal;
- TERNARY_TREE tVal;
- }
- %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
- %error-verbose
- %%
- Programa : DeclFuncVar DeclProg
- ;
- DeclFuncVar : Tipo ID DeclVar PONTOEV DeclFuncVar
- | Tipo ID ABREC INTCONST FECHAC DeclVar PONTOEV DeclFuncVar
- | Tipo ID DeclFunc DeclFuncVar
- | /* empty */
- ;
- DeclProg : PROGRAMA Bloco
- ;
- DeclVar : VIRGULA ID DeclVar
- | VIRGULA ID ABREC INTCONST FECHAC DeclVar
- | /* empty */
- ;
- DeclFunc :ABREP ListaParametros FECHAP Bloco
- ;
- ListaParametros : /* empty */
- | ListaParametrosCont
- ;
- ListaParametrosCont : Tipo ID
- | Tipo ID ABREC FECHAC
- | Tipo ID VIRGULA ListaParametrosCont
- | Tipo ID ABREC FECHAC VIRGULA ListaParametrosCont
- ;
- Bloco : ABRECH ListaDeclVar ListaComando FECHACH
- | ABRECH ListaDeclVar FECHACH
- ;
- ListaDeclVar : /* empty */
- | Tipo ID DeclVar PONTOEV ListaDeclVar
- | Tipo ID ABREC INTCONST FECHAC DeclVar PONTOEV ListaDeclVar
- ;
- Tipo : INT
- | CAR
- ;
- ListaComando : Comando
- | Comando ListaComando
- ;
- Comando : PONTOEV
- | Expr PONTOEV
- | RETORNE Expr PONTOEV
- | LEIA LValueExpr PONTOEV
- | ESCREVA Expr PONTOEV
- | ESCREVA CADEIACAR PONTOEV
- | NOVALINHA PONTOEV
- | SE ABREP Expr FECHAP ENTAO Comando
- | SE ABREP Expr FECHAP ENTAO Comando SENAO Comando
- | ENQUANTO ABREP Expr FECHAP EXECUTE Comando
- | Bloco
- ;
- Expr : AssignExpr
- ;
- AssignExpr : CondExpr
- | LValueExpr RECEBE AssignExpr
- ;
- CondExpr : OrExpr
- | OrExpr INTER Expr DOISP CondExpr
- ;
- OrExpr : OrExpr OU AndExpr
- | AndExpr
- ;
- AndExpr : AndExpr E EqExpr
- | EqExpr
- ;
- EqExpr : EqExpr IGUAL DesigExpr
- | EqExpr DIFERENTE DesigExpr
- | DesigExpr
- ;
- DesigExpr : DesigExpr MENOR AddExpr
- | DesigExpr MAIOR AddExpr
- | DesigExpr MAIORIGUAL AddExpr
- | DesigExpr MENORIGUAL AddExpr
- | AddExpr
- ;
- AddExpr : AddExpr MAIS MulExpr
- | AddExpr MENOS MulExpr
- | MulExpr
- ;
- MulExpr : MulExpr VEZES UnExpr
- | MulExpr DIVIDE UnExpr
- | MulExpr MOD UnExpr
- | UnExpr
- ;
- UnExpr : MENOS PrimExpr
- | NAO PrimExpr
- | PrimExpr
- ;
- LValueExpr : ID ABREC Expr FECHAC
- | ID
- ;
- PrimExpr : ID ABREP ListExpr FECHAP
- | ID ABREP FECHAP
- | ID ABREC Expr FECHAC
- | ID
- | CARCONST
- | INTCONST
- | ABREP Expr FECHAP
- ;
- ListExpr : AssignExpr
- | ListExpr VIRGULA AssignExpr
- ;
- %%
- void yyerror(const char* errmsg)
- {
- printf("\nERRO: %s\n", errmsg);
- }
- int yywrap(void) { return 1; }
- int main(int argc, char** argv)
- {
- #if YYDEBUG == 1
- extern int yydebug;
- yydebug = 1;
- #endif
- yyparse();
- return 0;
- }
- TERNARY_TREE create_node(int ival, int case_identifier, TERNARY_TREE p1, TERNARY_TREE p2, TERNARY_TREE p3)
- {
- TERNARY_TREE t;
- t = (TERNARY_TREE)malloc(sizeof(TREE_NODE));
- t->item = ival;
- t->nodeIdentifier = case_identifier;
- t->first = p1;
- t->second = p2;
- t->third = p3;
- return(t);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement