void AnalisaEscreva() { Lexico(); ChecaSimboloEsperado(Simbolo.S_ABRE_PARENTESES); Lexico(); ChecaSimboloEsperado(Simbolo.S_IDENTIFICADOR); SimboloInfo s = semantico.tabelaSimbolo.Pesquisa(token.lexema); if (!semantico.tabelaSimbolo.PesquisaVariavelInteiro(token.lexema) && !semantico.tabelaSimbolo.PesquisaFuncaoInteiro(token.lexema)) { if (s != null) { throw new ExceptionTipoInvalido("", SimboloTipo.INTEIRO, s.tipo, token); } else { throw new ExceptionVariavelNaoDeclarada("", token); } } if (s.tipo == SimboloTipo.FUNCAO_INTEIRO) { gerador.CALL(s.label); } else { gerador.LDV(s.endereco.ToString()); } Lexico(); ChecaSimboloEsperado(Simbolo.S_FECHA_PARENTESES); gerador.PRN(); Lexico(); }
void AnalisaBloco() { Lexico(); AnalisaEtapaDeclaracaoVariaveis(); AnalisaSubRotinas(); SimboloInfo escopo = semantico.tabelaSimbolo.PesquisaEscopo(); string nome = escopo.lexema; int count = semantico.tabelaSimbolo.NumeroDeVariaveisAlocadas(); int offset = semantico.tabelaSimbolo.NumeroDeVariaveisAlocadasNoTotal() - count; if (escopo != null) { if (escopo.tipo == SimboloTipo.PROGRAMA) { if (count > 0) { gerador.ALLOC(offset.ToString(), count.ToString(), escopo.label, "inicio do programa " + nome); } else { gerador.NULL(escopo.label, "inicio do programa " + nome); } } if (escopo.tipo == SimboloTipo.FUNCAO_BOOLEANO || escopo.tipo == SimboloTipo.FUNCAO_INTEIRO) { GeraJmpInicial(); if (count > 0) { gerador.ALLOC(offset.ToString(), count.ToString(), escopo.label, "inicio da funcao " + nome + ":" + escopo.tipo.ToString()); } else { gerador.NULL(escopo.label, "inicio da funcao " + nome + ":" + escopo.tipo.ToString()); } } if (escopo.tipo == SimboloTipo.PROCEDIMENTO) { GeraJmpInicial(); if (count > 0) { gerador.ALLOC(offset.ToString(), count.ToString(), escopo.label, "inicio do procedimento " + nome + ":" + escopo.tipo.ToString()); } else { gerador.NULL(escopo.label, "inicio do procedimento " + nome + ":" + escopo.tipo.ToString()); } } } AnalisaComandos(); }
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); } }
void AnalisaLeia() { Lexico(); ChecaSimboloEsperado(Simbolo.S_ABRE_PARENTESES); Lexico(); ChecaSimboloEsperado(Simbolo.S_IDENTIFICADOR); SimboloInfo s = semantico.tabelaSimbolo.Pesquisa(token.lexema); if (!semantico.tabelaSimbolo.PesquisaVariavelInteiro(token.lexema)) { throw new ExceptionVariavelNaoDeclarada("", token); } Lexico(); ChecaSimboloEsperado(Simbolo.S_FECHA_PARENTESES); gerador.RD(); gerador.STR(s.endereco.ToString()); Lexico(); }
SimboloTipo AnalisaChamadaFuncao() { ChecaSimboloEsperado(Simbolo.S_IDENTIFICADOR); SimboloInfo simbolo = semantico.tabelaSimbolo.Pesquisa(token.lexema); if (simbolo == null) { throw new ExceptionVariavelNaoDeclarada("", token); } if (simbolo.tipo == SimboloTipo.FUNCAO_INTEIRO || simbolo.tipo == SimboloTipo.FUNCAO_BOOLEANO) { gerador.CALL(simbolo.label); } Lexico(); return(simbolo.tipo); }
void ChamadaProcedimento(Token old) { SimboloInfo simbolo = semantico.tabelaSimbolo.Pesquisa(old.lexema); if (simbolo == null) { throw new ExceptionVariavelNaoDeclarada("Procedimento nao declarado", old); } if (simbolo.tipo != SimboloTipo.PROCEDIMENTO) { throw new ExceptionTipoInvalido("", SimboloTipo.PROCEDIMENTO, simbolo.tipo, old); } gerador.CALL(simbolo.label); //Lexico(); //ChecaSimboloEsperado(Simbolo.S_IDENTIFICADOR); // Lexico(); }
void FinalizaExpressao() { /*string comment = "expressao: "; * * foreach (var token in semantico.posFixa) * comment += token.lexema + " "; * gerador.NULL("", comment);*/ /* se (a + b) > (5 * x) * * ab+5x*> * ldv a * ldv b * add * ldc 5 * ldv x * muçt * cma */ foreach (var token in semantico.posFixa) { if (token.simbolo == Simbolo.S_IDENTIFICADOR) { SimboloInfo simbolo = semantico.tabelaSimbolo.Pesquisa(token.lexema); if (simbolo.tipo == SimboloTipo.INTEIRO || simbolo.tipo == SimboloTipo.BOOLEANO) { gerador.LDV(simbolo.endereco.ToString(), "", "LDV " + simbolo.lexema); } } if (token.simbolo == Simbolo.S_NUMERO) { gerador.LDC(token.lexema); } else if (token.simbolo == Simbolo.S_VERDADEIRO) { gerador.LDC("1"); } else if (token.simbolo == Simbolo.S_FALSO) { gerador.LDC("0"); } else if (token.simbolo == Simbolo.S_MAIOR) { gerador.CMA(); } else if (token.simbolo == Simbolo.S_MENOR) { gerador.CME(); } else if (token.simbolo == Simbolo.S_MENOR_IG) { gerador.CMEQ(); } else if (token.simbolo == Simbolo.S_MAIOR_IG) { gerador.CMAQ(); } else if (token.simbolo == Simbolo.S_IG) { gerador.CMEQ(); } else if (token.simbolo == Simbolo.S_DIF) { gerador.CDIF(); } else if (token.simbolo == Simbolo.S_E) { gerador.AND(); } else if (token.simbolo == Simbolo.S_OU) { gerador.OR(); } else if (token.simbolo == Simbolo.S_MAIS) { gerador.ADD(); } else if (token.simbolo == Simbolo.S_MENOS) { gerador.SUB(); } else if (token.simbolo == Simbolo.S_DIV) { gerador.DIVI(); } else if (token.simbolo == Simbolo.S_MULT) { gerador.MULT(); } else if (token.simbolo == Simbolo.S_NAO) { gerador.NEG(); } else if (token.simbolo == Simbolo.S_MENOS_U) { gerador.INV(); } } }