public void executeSintatico(List <Token> tokens) { resetValidators(); tokenList = tokens; if (tokenList.Count() > 0) { updateToken(); if (!hasEndedTokens && isSimbol(PROGRAMA)) { updateToken(); if (!hasEndedTokens && isSimbol(IDENTIFICADOR)) { Semantico.insereTabela(actualToken.lexem, NOME_PROGRAMA, 0); CodeGenerator.gera(EMPTY_STRING, START, EMPTY_STRING, EMPTY_STRING); CodeGenerator.gera(EMPTY_STRING, ALLOC, "0", "1"); totalVariables++; updateToken(); if (!hasEndedTokens && isSimbol(PONTO_VIRGULA)) { analisaBloco(); if (isSimbol(PONTO)) { updateToken(); if (!hasEndedTokens) { throwError(new CompiladorException(ERRO_SINTATICO), ERRO_FALTA); } CodeGenerator.gera(EMPTY_STRING, DALLOC, "0", "1"); CodeGenerator.gera(EMPTY_STRING, HLT, EMPTY_STRING, EMPTY_STRING); } else { throwError(new CompiladorException(ERRO_SINTATICO), ERRO_PONTO_FALTA); } } else { throwError(new CompiladorException(ERRO_SINTATICO), ERRO_PV); } } else { throwError(new CompiladorException(ERRO_SINTATICO), ERRO_FALTA); } } else { throwError(new CompiladorException(ERRO_SINTATICO), ERRO_NOME); } } }
private void analisaVariaveis() { int varsCreated = 0; do { if (!hasEndedTokens && isSimbol(IDENTIFICADOR)) { if (!Semantico.pesquisaDuplicVarTabela(actualToken.lexem)) { Semantico.insereTabela(actualToken.lexem, NOME_VARIAVEL, totalVariables + varsCreated); varsCreated++; updateToken(); if (!hasEndedTokens && (isSimbol(VIRGULA) || isSimbol(DOIS_PONTOS))) { if (!hasEndedTokens && isSimbol(VIRGULA)) { updateToken(); if (!hasEndedTokens && !isSimbol(IDENTIFICADOR)) { throwError(new CompiladorException(ERRO_SINTATICO), ERRO_VAR); } } } else { throwError(new CompiladorException(ERRO_SINTATICO), ERRO_DOIS_PONTOS); } } else { throwError(new CompiladorException(ERRO_SEMANTICO), DUPLIC_VAR_ERROR); } } else { throwError(new CompiladorException(ERRO_SINTATICO), ERRO_NOME); } } while (!hasEndedTokens && !isSimbol(DOIS_PONTOS)); updateToken(); declaredVar++; totalVarsCreatedLocally.Push(varsCreated); CodeGenerator.gera(EMPTY_STRING, ALLOC, totalVariables.ToString(), varsCreated.ToString()); totalVariables += varsCreated; analisaTipo(); }
private void analisaDeclaracaoProcedimento() { updateToken(); if (!hasEndedTokens && isSimbol(IDENTIFICADOR)) { if (!Semantico.pesquisaDeclProcTabela(actualToken.lexem)) { Semantico.insereTabela(actualToken.lexem, NOME_PROCEDIMENTO, rotulo); CodeGenerator.gera(rotulo.ToString(), NULL, EMPTY_STRING, EMPTY_STRING); rotulo++; Semantico.increaseLevel(); updateToken(); if (!hasEndedTokens && isSimbol(PONTO_VIRGULA)) { analisaBloco(); } else { throwError(new CompiladorException(ERRO_SINTATICO), ERRO_PV); } } else { throwError(new CompiladorException(ERRO_SEMANTICO), DECL_PROC_ERROR); } } else { throwError(new CompiladorException(ERRO_SINTATICO), ERRO_FALTA); } Semantico.voltaNivel(); }
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(); }