%{ #include int yylex(void); void yyerror(char *); extern int numeroLinhas; %} %token TK_IDENTIFICADOR TK_VALOR_NUMBER TK_VALOR_STRING TK_VALOR_BOOLEAN TK_NOT TK_AND TK_OR TK_OP_SOMA TK_VIRGULA %token TK_OP_MENOS TK_OP_MULT TK_OP_DIV TK_OP_IGUAL TK_OP_DIFERENTE TK_OP_MAIORIGUAL TK_OP_MENORIGUAL TK_OP_MAIOR %token TK_OP_MENOR TK_ABRE_COLCHETE TK_FECHA_COLCHETE TK_ABRE_PARENTESE TK_FECHA_PARENTESE TK_INTEGER TK_STRING %token TK_FUNCTION TK_BOOLEAN TK_AS TK_END TK_SUB TK_PRINT TK_INPUT TK_IF TK_THEN TK_ELSE TK_WHILE TK_FOR TK_TO TK_EXIT TK_STEP TK_NEXT %token TK_LOOP TK_DO TK_UNTIL TK_PROGRAM TK_TRUE TK_FALSE %start inicio %% inicio: inicio TK_PROGRAM identificador declaracoes listaComando TK_END {ast = criarASTNoh(INICIO, 4, $1, $3, $4, $5);} | ; declaracoes: declaracoes declaracoesDeVariavel {$$ = criarASTNoh(DECLARACOES, 2, $1, $2);} | declaracoes declaracao_funcao {$$ = criarASTNoh(DECLARACOES, 2, $1, $2);} | declaracoes declaracaoDeProcedimento {$$ = criarASTNoh(DECLARACOES, 2, $1, $2);} | {$$ = criarASTNoh(DECLARACOES, 0);} ; declaracaoDeProcedimento: TK_SUB identificador TK_ABRE_PARENTESE listaParametros TK_FECHA_PARENTESE declaracao_SO_variavel listaComando TK_END TK_SUB {$$ = criarASTNoh(DECLARACAO_DE_PROCEDIMENTO, 4,$2 ,$4, $6, $7);} ; declaracao_funcao: TK_FUNCTION identificador {$$ = criarASTNoh(DECLARACAO_DE_FUNCAO, 5,$2, $4, $7, $8, $9);} TK_ABRE_PARENTESE listaParametros TK_FECHA_PARENTESE TK_AS tipo declaracao_SO_variavel listaComando TK_END TK_FUNCTION ; listaParametros: identificador TK_AS tipo {$$ = criarASTNoh(LISTA_PARAMETROS, 2,$1, $3);} |identificador TK_AS tipo TK_VIRGULA listaParametros {$$ = criarASTNoh(LISTA_PARAMETROS, 3,$1, $3, $5);} | {$$ = criarASTNoh(LISTA_PARAMETROS, 0);} ; declaracao_SO_variavel: declaracoesDeVariavel {$$ = criarASTNoh(DECLARACAO_SOH_VARIAVEL, 1, $1);} | declaracoesDeVariavel declaracao_SO_variavel {$$ = criarASTNoh(DECLARACAO_SOH_VARIAVEL, 2, $1, $2);} | {$$ = criarASTNoh(DECLARACAO_SOH_VARIAVEL, 0);} ; declaracoesDeVariavel: tipo identificador {$$ = criarASTNoh(DECLARACOES_DE_VARIAVEL, 2, $1,$2);} | tipo identificador multiDeclaraVariaveis {$$ = criarASTNoh(DECLARACOES_DE_VARIAVEL, 3, $1,$2,$3);} ; multiDeclaraVariaveis : TK_VIRGULA identificador {$$ = criarASTNoh(MULTIDECLARA_VARIAVEIS, 1,$2);} |TK_VIRGULA identificador multiDeclaraVariaveis {$$ = criarASTNoh(MULTIDECLARA_VARIAVEIS, 2,$2, $3);} ; tipo: TK_INTEGER {$$ = criarASTNoh(TIPO, 0);} | TK_STRING {$$ = criarASTNoh(TIPO, 0);} | TK_BOOLEAN {$$ = criarASTNoh(TIPO, 0);} ; doWhile: TK_DO TK_WHILE condicaoBooleana listaComando possivelSaida listaComando TK_LOOP {printf("comecou");} {$$ = criarASTNoh(DO_WHILE, 4, $3, $4, $5, $6);} ; condicional: TK_IF condicaoBooleana TK_THEN listaComando TK_ELSE listaComando TK_END TK_IF {$$ = criarASTNoh(CONDICIONAL, 3, $2, $4, $6);} ; atribuicao: identificador TK_OP_IGUAL expressao {$$ = criarASTNoh(ATRIBUICAO, 2,$1, $3);} | identificador TK_OP_IGUAL valorString {$$ = criarASTNoh(ATRIBUICAO, 2,$1,$3);} ; loopUntil: TK_DO {$$ = criarASTNoh(LOOP_UNTIL, 4, $2, $3, $4, $7);} listaComando possivelSaida listaComando TK_LOOP TK_UNTIL condicaoBooleana ; loopFor: TK_FOR identificador TK_OP_IGUAL valorNumber TK_TO valorNumber stepOpcional {$$ = criarASTNoh(LOOP_FOR, 8,$2,$4,$6,$7,$8,$9,$10,$12);} listaComando exitForOpcional listaComando TK_NEXT identificador ; stepOpcional: TK_STEP valorNumber {$$ = criarASTNoh(STEP_OPCIONAL, 1,$2);} | {$$ = criarASTNoh(STEP_OPCIONAL, 0);} ; exitForOpcional: TK_EXIT TK_FOR {$$ = criarASTNoh(EXIT_FOR_OPCIONAL, 0);} | {$$ = criarASTNoh(EXIT_FOR_OPCIONAL, 0);} ; chamadaFuncProc: identificador TK_ABRE_PARENTESE parametrosFuncProc TK_FECHA_PARENTESE {$$ = criarASTNoh(CHAMADA_FUNC_PROC, 2,$1, $3);} ; parametrosFuncProc: listaParametrosFuncProc expressao {$$ = criarASTNoh(PARAMETROS_FUNC_PROC, 2, $1, $2);} | listaParametrosFuncProc chamadaFuncProc {$$ = criarASTNoh(PARAMETROS_FUNC_PROC, 2, $1, $2);} ; listaParametrosFuncProc: parametrosFuncProc TK_VIRGULA {$$ = criarASTNoh(LISTA_PARAMETROS_FUNC_PROC, 1, $1);} | {$$ = criarASTNoh(LISTA_PARAMETROS_FUNC_PROC, 0);} ; listaComando: comando {$$ = criarASTNoh(LISTA_COMANDO, 1, $1);} | listaComando comando {$$ = criarASTNoh(LISTA_COMANDO, 2, $1,$2);} ; comando: condicional {$$ = criarASTNoh(COMANDO, 1, $1);} | doWhile {$$ = criarASTNoh(COMANDO, 1, $1);} | atribuicao {$$ = criarASTNoh(COMANDO, 1, $1);} | loopUntil {$$ = criarASTNoh(COMANDO, 1, $1);} | chamadaFuncProc {$$ = criarASTNoh(COMANDO, 1, $1);} | print {$$ = criarASTNoh(COMANDO, 1, $1);} | input {$$ = criarASTNoh(COMANDO, 1, $1);} | loopFor {$$ = criarASTNoh(COMANDO, 1, $1);} | {$$ = criarASTNoh(COMANDO, 0);} ; print: TK_PRINT listaExpressao {$$ = criarASTNoh(PRINT, 1, $2);} ; listaExpressao: expressao {$$ = criarASTNoh(LISTA_EXPRESSAO, 1, $1);} |listaExpressao TK_VIRGULA expressao {$$ = criarASTNoh(LISTA_EXPRESSAO, 2, $1, $3);} |valorString {$$ = criarASTNoh(LISTA_EXPRESSAO, 1,$1);} |listaExpressao TK_VIRGULA valorString {$$ = criarASTNoh(LISTA_EXPRESSAO, 2, $1,$3);} ; input : TK_INPUT identificador listaVariaveis {$$ = criarASTNoh(INPUT, 2,$2, $3);} ; listaVariaveis: listaVariaveis TK_VIRGULA identificador {$$ = criarASTNoh(LISTA_VARIAVEIS, 2, $1,$3);} | {$$ = criarASTNoh(LISTA_VARIAVEIS, 0);} ; expressoesAritmeticas: expressoesAritmeticas TK_OP_SOMA termo {$$ = criarASTNoh(EXPRESSOES_ARITMETICAS, 2, $1, $3);} |expressoesAritmeticas TK_OP_MENOS termo {$$ = criarASTNoh(EXPRESSOES_ARITMETICAS, 2, $1, $3);} |termo {$$ = criarASTNoh(EXPRESSOES_ARITMETICAS, 1, $1);} ; termo: termo TK_OP_MULT valorTermo {$$ = criarASTNoh(TERMO, 2, $1, $3);} |termo TK_OP_DIV valorTermo {$$ = criarASTNoh(TERMO, 2, $1, $3);} |valorTermo {$$ = criarASTNoh(TERMO, 1, $1);} ; valorTermo: valorNumber {$$ = criarASTNoh(VALOR_TERMO, 1,$1);} | identificador {$$ = criarASTNoh(VALOR_TERMO, 1,$1);} | TK_ABRE_PARENTESE expressoesAritmeticas TK_FECHA_PARENTESE {$$ = criarASTNoh(VALOR_TERMO, 1, $2);} | chamadaFuncProc {$$ = criarASTNoh(VALOR_TERMO, 1, $1);} ; possivelSaida: TK_EXIT TK_DO {$$ = criarASTNoh(POSSIVEL_SAIDA, 0);} | {$$ = criarASTNoh(POSSIVEL_SAIDA, 0);} ; expressao: expressoesAritmeticas {$$ = criarASTNoh(EXPRESSAO, 1,$1);} | expressaoBooleana {$$ = criarASTNoh(EXPRESSAO, 1,$1);} | expressoesRelacionais {$$ = criarASTNoh(EXPRESSAO, 1,$1);} ; condicaoBooleana: expressaoBooleana {printf("passou Expressao1");} {$$ = criarASTNoh(CONDICAO_BOOLEANA, 1, $1);} |expressoesRelacionais {printf("passou Expressao2");} {$$ = criarASTNoh(CONDICAO_BOOLEANA, 1, $1);} | identificador {$$ = criarASTNoh(CONDICAO_BOOLEANA, 1, $1);} ; expressaoBooleana: expressaoBooleana TK_AND termoBooleano {$$ = criarASTNoh(EXPRESSAO_BOOLEANA, 2,$1,$3);} |expressaoBooleana TK_OR termoBooleano {$$ = criarASTNoh(EXPRESSAO_BOOLEANA, 2,$1,$3);} |termoBooleano {$$ = criarASTNoh(EXPRESSAO_BOOLEANA, 1,$1);} ; termoBooleano: TK_NOT fatorBooleano {$$ = criarASTNoh(TERMO_BOOLEANO, 1,$2);} |fatorBooleano {$$ = criarASTNoh(TERMO_BOOLEANO, 1,$1);} ; fatorBooleano: identificador {$$ = criarASTNoh(FATOR_BOOLEANO, 1,$1);} |TK_TRUE {$$ = criarASTNoh(FATOR_BOOLEANO, 0);} |TK_FALSE {$$ = criarASTNoh(FATOR_BOOLEANO, 0);} |TK_ABRE_PARENTESE expressaoBooleana TK_FECHA_PARENTESE {$$ = criarASTNoh(FATOR_BOOLEANO, 1,$2);} ; expressoesRelacionais: expressoesAritmeticas TK_OP_MAIOR expressoesAritmeticas {$$ = criarASTNoh(EXPRESSOES_RELACIONAIS, 2,$1,$3);} |expressoesAritmeticas TK_OP_MENOR expressoesAritmeticas {$$ = criarASTNoh(EXPRESSOES_RELACIONAIS, 2,$1,$3);} |expressoesAritmeticas TK_OP_MAIORIGUAL expressoesAritmeticas {$$ = criarASTNoh(EXPRESSOES_RELACIONAIS, 2,$1,$3);} |expressoesAritmeticas TK_OP_MENORIGUAL expressoesAritmeticas {$$ = criarASTNoh(EXPRESSOES_RELACIONAIS, 2,$1,$3);} |expressao TK_OP_IGUAL expressao {$$ = criarASTNoh(EXPRESSOES_RELACIONAIS, 2,$1,$3);} |expressao TK_OP_DIFERENTE expressao {$$ = criarASTNoh(EXPRESSOES_RELACIONAIS, 2,$1,$3);} |TK_ABRE_PARENTESE expressoesRelacionais TK_FECHA_PARENTESE {$$ = criarASTNoh(EXPRESSOES_RELACIONAIS, 1,$2);} ; identificador: TK_IDENTIFICADOR {$$ = criarASTNoh(IDENTIFICADOR, 0);} ; valorString: TK_VALOR_STRING {$$ = criarASTNoh(VALOR_STRING, 0);} ; valorNumber: TK_VALOR_NUMBER {$$ = criarASTNoh(VALOR_NUMBER), 0);} %% void yyerror(char *s) { printf("erro na linha %d", numeroLinhas ); fprintf(stderr, "%s\n", s); } int main(void) { yyparse(); return 0; }