예제 #1
0
파일: Program.cs 프로젝트: vnoan/Compilador
        static void Main(string[] args)
        {
            lexico    = new Lexico(entrada);
            sintatico = new Sintatico(lexico);
            Token t;

            sintatico.PROG();

            /*
             * do
             * {
             *  t = lexico.NextToken();
             *  if (t == null)
             *      break;  //Erro Léxico
             *  //Console.WriteLine("Linha: "+ t.Linha + "\tLexema: " + t.Lexograma + "\tDescricao: " + t.Descricao );
             * } while (t.Lexograma != "EOF");
             */
            Console.Read();
        }
예제 #2
0
        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);
            }
        }