void AnalisaEnquanto() { ulong aux1, aux2; Token old = token; aux1 = contadorEnquanto; gerador.NULL("WHILE_" + contadorEnquanto.ToString()); contadorEnquanto++; Lexico(); semantico.ReinicializaPosFixa(); SimboloTipo tipo = AnalisaExpressao(); if (!MesmoTipo(tipo, SimboloTipo.BOOLEANO)) { throw new ExceptionTipoInvalido("", SimboloTipo.BOOLEANO, tipo, old); } semantico.FinalizaPosFixa(); ChecaSimboloEsperado(Simbolo.S_FACA); FinalizaExpressao(); aux2 = contadorEnquanto; gerador.JMPF("END_WHILE_" + contadorEnquanto.ToString()); contadorEnquanto++; Lexico(); AnalisaComandoSimples(); gerador.JMP("WHILE_" + aux1.ToString()); gerador.NULL("END_WHILE_" + aux2.ToString()); }
public ExceptionTipoInvalido(string info, SimboloTipo esperado, SimboloTipo recebido, Token token) { this.token = token; this.info = info; this.recebido = recebido; this.esperado = esperado; }
public SimboloInfo(string lexema, SimboloTipo tipo, bool marca, int endereco) { this.lexema = lexema; this.tipo = tipo; this.marca = marca; this.endereco = endereco; this.label = "{**invalida**}"; }
bool MesmoTipo(SimboloTipo tipo1, SimboloTipo tipo2) { if (tipo1 == SimboloTipo.INTEIRO || tipo1 == SimboloTipo.FUNCAO_INTEIRO) { return(tipo2 == SimboloTipo.INTEIRO || tipo2 == SimboloTipo.FUNCAO_INTEIRO); } else if (tipo1 == SimboloTipo.BOOLEANO || tipo1 == SimboloTipo.FUNCAO_BOOLEANO) { return(tipo2 == SimboloTipo.BOOLEANO || tipo2 == SimboloTipo.FUNCAO_BOOLEANO); } return(false); }
void AnalisaAtribuicao(Token old) { SimboloInfo simbolo = semantico.tabelaSimbolo.Pesquisa(old.lexema); if (simbolo == null) { throw new ExceptionVariavelNaoDeclarada("", old); } Lexico(); /*ChecaSimboloEsperado(Simbolo.S_IDENTIFICADOR); * Lexico(); * ChecaSimboloInesperado(Simbolo.S_ATRIBUICAO); * Lexico();*/ semantico.ReinicializaPosFixa(); SimboloTipo tipo2 = AnalisaExpressao(); if (!MesmoTipo(simbolo.tipo, tipo2)) { throw new ExceptionTipoInvalido("", simbolo.tipo, tipo2, old); } semantico.FinalizaPosFixa(); FinalizaExpressao(); if (simbolo.tipo == SimboloTipo.FUNCAO_BOOLEANO || simbolo.tipo == SimboloTipo.FUNCAO_INTEIRO) { // Analisa retorno SimboloInfo escopo = semantico.tabelaSimbolo.PesquisaEscopo(); if (escopo == null || escopo.tipo != SimboloTipo.FUNCAO_BOOLEANO && escopo.tipo != SimboloTipo.FUNCAO_INTEIRO) { throw new ExceptionRetornoDeFuncaoInesperado("", old); } if (escopo.lexema != old.lexema) { throw new ExceptionRetornoDeFuncaoInesperado("", old); } int count = semantico.tabelaSimbolo.NumeroDeVariaveisAlocadas(); int offset = semantico.tabelaSimbolo.NumeroDeVariaveisAlocadasNoTotal() - count; gerador.RETURNF(offset.ToString(), count.ToString(), "", "RETURNF da funcao " + escopo.lexema); } else { gerador.STR(simbolo.endereco.ToString(), "", "STR " + simbolo.lexema); } }
SimboloTipo AnalisaExpressaoSimples() { if (token.simbolo == Simbolo.S_MAIS) { Lexico(); } if (token.simbolo == Simbolo.S_MENOS) { semantico.ParaPosFixa(new Token(Simbolo.S_MENOS_U, "-", 0, 0)); Lexico(); } SimboloTipo tipo1 = AnalisaTermo(); while (token.simbolo == Simbolo.S_MAIS || token.simbolo == Simbolo.S_MENOS || token.simbolo == Simbolo.S_OU) { semantico.ParaPosFixa(token); Token old = token; Lexico(); SimboloTipo tipo2 = AnalisaTermo(); if (old.simbolo == Simbolo.S_MAIS || old.simbolo == Simbolo.S_MENOS) { if (!MesmoTipo(tipo1, SimboloTipo.INTEIRO)) { throw new ExceptionTipoInvalido("", SimboloTipo.INTEIRO, tipo1, old); } if (!MesmoTipo(tipo2, SimboloTipo.INTEIRO)) { throw new ExceptionTipoInvalido("", SimboloTipo.INTEIRO, tipo2, old); } tipo1 = SimboloTipo.INTEIRO; } else if (old.simbolo == Simbolo.S_OU) { if (!MesmoTipo(tipo1, SimboloTipo.BOOLEANO)) { throw new ExceptionTipoInvalido("", SimboloTipo.BOOLEANO, tipo1, old); } if (!MesmoTipo(tipo2, SimboloTipo.BOOLEANO)) { throw new ExceptionTipoInvalido("", SimboloTipo.BOOLEANO, tipo2, old); } tipo1 = SimboloTipo.BOOLEANO; } } return(tipo1); }
public void Insere(List <string> lexemas, SimboloTipo tipo, bool marca, int enderecoPilha = -1) { foreach (var item in lexemas) { simbolos.Add(new SimboloInfo(item, tipo, marca, enderecoPilha)); if (enderecoPilha != -1) { enderecoPilha++; } if (tipo == SimboloTipo.PROCEDIMENTO || tipo == SimboloTipo.PROGRAMA || tipo == SimboloTipo.FUNCAO_INTEIRO || tipo == SimboloTipo.FUNCAO_BOOLEANO) { simbolos[simbolos.Count - 1].label = item + "_" + numeroDeProcFuncUsados; numeroDeProcFuncUsados++; } } }
SimboloTipo AnalisaTermo() { SimboloTipo tipo1 = AnalisaFator(); while (token.simbolo == Simbolo.S_MULT || token.simbolo == Simbolo.S_DIV || token.simbolo == Simbolo.S_E) { semantico.ParaPosFixa(token); Token old = token; Lexico(); SimboloTipo tipo2 = AnalisaFator(); if (old.simbolo == Simbolo.S_MULT || old.simbolo == Simbolo.S_DIV) { if (!MesmoTipo(tipo1, SimboloTipo.INTEIRO)) { throw new ExceptionTipoInvalido("", SimboloTipo.INTEIRO, tipo1, old); } if (!MesmoTipo(tipo2, SimboloTipo.INTEIRO)) { throw new ExceptionTipoInvalido("", SimboloTipo.INTEIRO, tipo2, old); } tipo1 = SimboloTipo.INTEIRO; } else if (old.simbolo == Simbolo.S_E) { if (!MesmoTipo(tipo1, SimboloTipo.BOOLEANO)) { throw new ExceptionTipoInvalido("", SimboloTipo.BOOLEANO, tipo1, old); } if (!MesmoTipo(tipo2, SimboloTipo.BOOLEANO)) { throw new ExceptionTipoInvalido("", SimboloTipo.BOOLEANO, tipo2, old); } tipo1 = SimboloTipo.BOOLEANO; } } return(tipo1); }
/* * cma * jmpf senao * COMANDOS ENTAO * JMP PULA_SENAO * COMANDOS SENAO * JMP PULA_SENAO * */ void AnalisaSe() { ulong aux; Token old = token; Lexico(); semantico.ReinicializaPosFixa(); SimboloTipo tipo = AnalisaExpressao(); if (!MesmoTipo(tipo, SimboloTipo.BOOLEANO)) { throw new ExceptionTipoInvalido("", SimboloTipo.BOOLEANO, tipo, old); } semantico.FinalizaPosFixa(); ChecaSimboloEsperado(Simbolo.S_ENTAO); FinalizaExpressao(); gerador.JMPF("END_IF_" + contadorSe.ToString()); Lexico(); aux = contadorSe; contadorSe += 2; AnalisaComandoSimples(); if (token.simbolo == Simbolo.S_SENAO) { gerador.JMP("END_IF_" + (aux + 1).ToString()); gerador.NULL("END_IF_" + aux.ToString()); aux++; Lexico(); AnalisaComandoSimples(); } gerador.NULL("END_IF_" + aux.ToString()); }
SimboloTipo AnalisaFator() { semantico.ParaPosFixa(token); if (token.simbolo == Simbolo.S_IDENTIFICADOR) { return(AnalisaChamadaFuncao()); } else if (token.simbolo == Simbolo.S_NUMERO) { Lexico(); return(SimboloTipo.INTEIRO); } else if (token.simbolo == Simbolo.S_NAO) { Lexico(); return(AnalisaFator()); } else if (token.simbolo == Simbolo.S_ABRE_PARENTESES) { Lexico(); SimboloTipo tipo = AnalisaExpressao(); ChecaSimboloEsperado(Simbolo.S_FECHA_PARENTESES); semantico.ParaPosFixa(token); Lexico(); return(tipo); } else if (token.lexema == "verdadeiro" || token.lexema == "falso") { Lexico(); return(SimboloTipo.BOOLEANO); } else { throw new ExceptionSimboloInesperado("", token); } }
SimboloTipo AnalisaExpressao() { SimboloTipo tipo1 = AnalisaExpressaoSimples(); if (token.simbolo == Simbolo.S_MAIOR || token.simbolo == Simbolo.S_MENOR || token.simbolo == Simbolo.S_MAIOR_IG || token.simbolo == Simbolo.S_MENOR_IG || token.simbolo == Simbolo.S_DIF || token.simbolo == Simbolo.S_IG) { semantico.ParaPosFixa(token); Lexico(); SimboloTipo tipo2 = AnalisaExpressaoSimples(); if (!MesmoTipo(tipo1, tipo2)) { throw new ExceptionTipoInvalido("", tipo1, tipo2, token); } tipo1 = SimboloTipo.BOOLEANO; } return(tipo1); }