public Sintactico(Lexico lexico) { lex = lexico; tokens = lex.getTokens(); validarProgramaComienzaLlave(); validarCochineroLlaves(); for (int i = 0; i < tokens.Count; i++) { getTipo(tokens.ElementAt(i), i); } }
private bool executarSintatico(Sintatico sintatico) { try { sintatico.executeSintatico(lexico.getTokens()); fileReader.saveCompilerResponse(CodeGenerator.getVMCommands()); return(true); } catch (CompiladorException exception) { Token errorToken = sintatico.errorToken; switch (exception.Message) { case ERRO_LEXICO: paintErrorLine(errorToken.line); switch (errorToken.errorType) { case COMENTARIO_ERROR: richTextBox2.Text += "Comentário aberto mas não fechado na linha " + errorToken.line + "\n"; break; case CARACTER_ERROR: richTextBox2.Text += "Caracter '" + errorToken.lexem + "' não reconhecido na linha " + errorToken.line + "\n"; break; case IDENTIFICADOR_COM_UNDERLINE: richTextBox2.Text += "Identificador comecando com underline na linha " + errorToken.line + "\n"; break; } break; case ERRO_SINTATICO: paintErrorLine(errorToken.line); switch (errorToken.errorType) { case ERRO_PV: richTextBox2.Text += "Falta ponto e virgula na linha " + errorToken.line + "\n"; break; case ERRO_NOME: richTextBox2.Text += "Não pode usar '" + errorToken.lexem + "' palavra pré determinada na linha " + errorToken.line + "\n"; break; case ERRO_FALTA: richTextBox2.Text += "Falta caracter ou comando na linha " + errorToken.line + "\n"; break; case ERRO_INICIO: richTextBox2.Text += "Falta INICIO na linha " + errorToken.line + "\n"; break; case ERRO_PARENTESIS: richTextBox2.Text += "Falta parentesis na linha " + errorToken.line + "\n"; break; case ERRO_TIPO: richTextBox2.Text += "São aceitos apenas INTEIRO ou BOOLEANO na linha " + errorToken.line + "\n"; break; case ERRO_MAIS: richTextBox2.Text += "Linha com caracter a mais na linha " + errorToken.line + "\n"; break; case ERRO_PONTO_MEIO: richTextBox2.Text += "Ponto final apenas na última linha e não na linha " + errorToken.line + "\n"; break; case ERRO_CARACTER: richTextBox2.Text += "'" + errorToken.lexem + "' na linha " + errorToken.line + "\n"; break; case ERRO_CORPO: richTextBox2.Text += "Corpo vazio na linha " + errorToken.line + "\n"; break; case ERRO_VAR: richTextBox2.Text += "Apenas variável após a virgula na linha " + errorToken.line + "\n"; break; case ERRO_DOIS_PONTOS: richTextBox2.Text += "Espera-se ' : ' após a última variável e não ' " + errorToken.lexem + " ' na linha " + errorToken.line + "\n"; break; case ERRO_ATRIBUICAO: richTextBox2.Text += "Espera-se ' := ' e não ' " + errorToken.lexem + " ' após a variável na linha " + errorToken.line + "\n"; break; case ERRO_BLOCO: richTextBox2.Text += "Caracter encontrado ' " + errorToken.lexem + " '. Não é possível continuar sem pelo menos 'var', 'procedimento', 'função' ou 'inicio' após o ponto e vírgula da linha " + errorToken.line + "\n"; break; case ERRO_PONTO_FALTA: richTextBox2.Text += "Falta ponto final no fim da linha " + errorToken.line + "\n"; break; } break; case ERRO_SEMANTICO: paintErrorLine(errorToken.line); switch (errorToken.errorType) { case DUPLIC_VAR_ERROR: richTextBox2.Text += "Variavel '" + errorToken.lexem + "' nao declarada ou duplicada na linha " + errorToken.line + "\n"; break; case DECL_VAR_ERROR: richTextBox2.Text += "Variavel '" + errorToken.lexem + "' nao declarada ou duplicada na linha " + errorToken.line + "\n"; break; case DECL_PROC_ERROR: richTextBox2.Text += "Procedimento '" + errorToken.lexem + "' nao declarado ou duplicado na linha " + errorToken.line + "\n"; break; case DECL_FUNC_ERROR: richTextBox2.Text += "Funcao '" + errorToken.lexem + "' nao declarada ou duplicada na linha " + errorToken.line + "\n"; break; case ITEM_NOT_FOUND: richTextBox2.Text += "Identificador '" + errorToken.lexem + "' não encontrado\n"; break; case INVALID_TYPES: richTextBox2.Text += "Expressao da linha " + errorToken.line + " com tipos incoerentes\n"; break; case DECL_VAR_FUNC_ERROR: richTextBox2.Text += "Variavel ou funcao nao encontrada na linha " + errorToken.line + "\n"; break; case EXPECTED_FUNCTION_RETURN: richTextBox2.Text += "Faltando retornos da funcao na linha " + errorToken.line + "\n"; break; case FUNCTION_LAST_LINE_NOT_RETURN: richTextBox2.Text += "Nem todos os caminhos de codigo da funcao " + exception.InnerException.Message + " retornam um valor\n"; break; case INVALID_FUNCTION_NAME: richTextBox2.Text += "Atribuicao da linha " + errorToken.line + " nao referencia a funcao atual\n"; break; case WHILE_WITH_RETURN: richTextBox2.Text += "Enquanto da linha " + errorToken.line + " nao deve conter retorno da funcao\n"; break; case ASSIGNMENT_EXPRESSION_MUST_BE_BOOL: richTextBox2.Text += "Tipo atribuido na linha " + errorToken.line + " deve ser booleano\n"; break; case ASSIGNMENT_EXPRESSION_MUST_BE_INT: richTextBox2.Text += "Tipo atribuido na linha " + errorToken.line + " deve ser inteiro\n"; break; case EXPRESSION_MUST_BE_BOOL: richTextBox2.Text += "Expressao da linha " + errorToken.line + " deve ter resultado booleano\n"; break; case EXPRESSION_MUST_BE_INT: richTextBox2.Text += "Expressao da linha " + errorToken.line + " deve ter resultado inteiro\n"; break; case ANALYZING_EXPRESSION_ERROR: richTextBox2.Text += "Erro na linha " + errorToken.line + ": " + exception.InnerException.Message + "\n"; break; case UNREACHABLE_CODE: richTextBox2.Text += "Funcao da linha " + errorToken.line + " possui codigo inalcançavel\n"; break; case INVALID_PROC_CALL: richTextBox2.Text += "Somente pode ser chamado procedimentos na linha " + errorToken.line + "\n"; break; } break; } return(false); } }