private void analisaTipo() { if (!hasEndedTokens && !isSimbol(INTEIRO) && !isSimbol(BOOLEANO)) { throwError(new CompiladorException(ERRO_SINTATICO), ERRO_TIPO); } else { Semantico.colocaTipoTabela(isSimbol(INTEIRO) ? TIPO_INTEIRO : TIPO_BOOLEANO); updateToken(); } }
private void analisaDeclaracaoFuncao() { updateToken(); if (!hasEndedTokens && isSimbol(IDENTIFICADOR)) { actualFunctionName.Push(actualToken.lexem); if (!Semantico.pesquisaDeclFuncTabela(actualToken.lexem)) { Semantico.insereTabela(actualToken.lexem, NOME_FUNCAO, rotulo); CodeGenerator.gera(rotulo.ToString(), NULL, EMPTY_STRING, EMPTY_STRING); rotulo++; Semantico.increaseLevel(); functionLine.Push(actualToken.line); updateToken(); if (!hasEndedTokens && isSimbol(DOIS_PONTOS)) { updateToken(); if (!hasEndedTokens && (isSimbol(INTEIRO) || isSimbol(BOOLEANO))) { string type = isSimbol(INTEIRO) ? TIPO_INTEIRO : TIPO_BOOLEANO; Semantico.colocaTipoTabela(type); updateToken(); if (!hasEndedTokens && isSimbol(PONTO_VIRGULA)) { functionReturnsExpected++; analisaBloco(); functionReturnsExpected--; if (!returnMade) { throwError(new CompiladorException(ERRO_SEMANTICO, new CompiladorException(actualFunctionName.Peek())), returnsMade > 0 ? FUNCTION_LAST_LINE_NOT_RETURN : EXPECTED_FUNCTION_RETURN, functionLine.Peek()); } actualFunctionName.Pop(); functionLine.Pop(); } } else { throwError(new CompiladorException(ERRO_SINTATICO), ERRO_TIPO); } } else { throwError(new CompiladorException(ERRO_SINTATICO), ERRO_FALTA); } } else { throwError(new CompiladorException(ERRO_SEMANTICO), DECL_FUNC_ERROR); } } else { throwError(new CompiladorException(ERRO_SINTATICO), ERRO_NOME); } Semantico.voltaNivel(); }