Exemple #1
0
        public bool Compile(string programa)
        {
            Sintatico sintatico = new Sintatico();

            programa = programa.Trim();

            if (string.IsNullOrWhiteSpace(programa))
            {
                return(false);
            }

            try
            {
                Lexico    lexico    = new Lexico(programa);
                Semantico semantico = new Semantico();

                sintatico.Parse(lexico, semantico);

                ProcessarPrograma(lexico);

                Assembly = string.Join(Environment.NewLine, semantico.Codigo);

                return(true);
            }
            catch (LexicalException ex)
            {
                throw new LexicalException(string.Format("Erro na linha {0}: {1}", GetLine(programa, ex.Position), ex.Message));
            }
            catch (SyntaticException ex)
            {
                throw new SyntaticException(string.Format("Erro na linha {0}: encontrado {1} esperado {2}", GetLine(programa, ex.Position), sintatico.CurrentToken.Lexeme, ex.Message));
            }
            catch (SemanticException ex)
            {
                throw new SemanticException(string.Format("Erro na linha {0}: {1}", GetLine(programa, ex.Position), ex.Message));
            }
            catch (Exception ex)
            {
                throw new Exception(string.Format("Erro desconhecido: {0} {1}{1}{2}", ex.Message, Environment.NewLine, ex.StackTrace));
            }
        }
Exemple #2
0
        private void BtnCompilar_Click(object sender, RoutedEventArgs e)
        {
            var sourceCode = new TextRange(CodigoFonte.Document.ContentStart, CodigoFonte.Document.ContentEnd).Text;

            if (sourceCode == "" || sourceCode == "\r\n")
            {
                MessageBox.Show("Não há nada para ser compilado!\nPor favor digite um código fonte.", "Atenção!", MessageBoxButton.OK, MessageBoxImage.Information);
                return;
            }

            Lexico.ScanText(sourceCode);
            if (Lexico.ContemErroLexico)
            {
                var erros = Lexico.Tokens.Where(t => t.Tag == SimpleCompilerService.Suporte.Tag.ERRO_LEXICO).ToList();
                Console.Text = ErroLexico(erros);
            }
            else
            {
                try
                {
                    Sintatico.Analyze();

                    var sucesso = "Análise Léxica ✓\r\nAnálise Sintática ✓\r\nAnálise Semântica ✓\r\n\r\nHora: " + DateTime.Now.ToLongTimeString();
                    Console.Text = sucesso;
                }
                catch (Exception ex)
                {
                    if (ex.Message.Contains("#sintatico#"))
                    {
                        Console.Text = ErroSintatico(ex.Message);
                    }
                    else
                    {
                        Console.Text = ErroSemantico(ex.Message);
                    }
                }
            }
        }
        static int Main(string[] args)
        {
            /*
             * if (args.Length == 0) {
             *  Console.WriteLine("Digite o nome do arquivo de entrada!");
             *  return 1;
             * }*/

            //var path = System.IO.Path.Combine(Environment.CurrentDirectory, args[0]);
            var path = "Teste.c";

            if (System.IO.File.Exists(path))
            {
                io = new ModuloIO(path);
                analisadorLexico = new Lexico();
                analisadorLexico.Executa(io);
                io.SalvaTokens(analisadorLexico.ListaTokens);
                foreach (Token tk in analisadorLexico.ListaTokens)
                {
                    Console.WriteLine(tk.ToString());
                }

                if (analisadorLexico.Status)
                {
                    analisadorSintatico = new Sintatico(analisadorLexico.ListaTokens);
                    analisadorSintatico.Programa();
                    Debuga();
                }

                return(0);
            }
            else
            {
                Console.WriteLine("Arquivo não existe!");
                return(1);
            }
        }
Exemple #4
0
        static void Main()
        {
            Console.OutputEncoding = System.Text.Encoding.UTF8;

            Console.Out.WriteLine("Digite 0 para ver a Análise Léxica, Sintática e Semântica");
            Console.Out.WriteLine("Digite 1 para ver apenas a Análise Léxica e Sintática");
            Console.Out.WriteLine("Digite 2 para ver apenas a Análise Léxica e Semântica");
            Console.Out.WriteLine("Digite 3 para ver apenas a Análise Sintática e Semântica");
            Console.Out.WriteLine("Digite 4 para ver apenas a Análise Léxica");
            Console.Out.WriteLine("Digite 5 para ver apenas a Análise Sintática");
            Console.Out.WriteLine("Digite 6 para ver apenas a Análise Semântica");
            Console.Out.WriteLine("Default = 0");
            Output outputMode;

            try
            {
                outputMode = (Output)(int)char.GetNumericValue(Console.ReadLine()[0]);
            }
            catch (Exception)
            {
                outputMode = 0;
            }


            Console.Out.WriteLine("Digite 0 para criar um arquivo de output");
            Console.Out.WriteLine("Digite 1 para mostrar a saída no console");
            Console.Out.WriteLine("Default = 0");
            ExitMode exitMode;

            try
            {
                exitMode = (ExitMode)(int)char.GetNumericValue(Console.ReadLine()[0]);
            }
            catch (Exception)
            {
                exitMode = 0;
            }

            string           name;
            List <Token.Tok> lt;
            Token            t;

            do
            {
                string path = @"";
                Console.Out.WriteLine("Escreva o nome do arquivo de leitura");
                Console.Out.WriteLine("Esse arquivo deve estar na pasta do executável");
                name  = Console.ReadLine();
                path += name;

                t  = new Token(path);
                lt = t.ReadFile();
            } while (lt == null);
            Sintatico s   = new Sintatico();
            Semantico sem = new Semantico();

            switch (outputMode)
            {
            case Output.LexSin:
                PrintLexico(t, exitMode);
                Console.Out.Close();
                StreamWriter sw = new StreamWriter(Console.OpenStandardOutput())
                {
                    AutoFlush = true
                };
                if (exitMode.Equals(ExitMode.Console))
                {
                    Console.SetOut(sw);
                    Console.OutputEncoding = System.Text.Encoding.UTF8;
                    Console.Out.WriteLine("\n\nPressione uma tecla para continuar para o Sintatico\n\n");
                    Console.ReadKey();
                }
                PrintSintatico(s, lt, exitMode);
                break;

            case Output.LexSem:
                PrintLexico(t, exitMode);
                Console.Out.Close();
                sw = new StreamWriter(Console.OpenStandardOutput())
                {
                    AutoFlush = true
                };
                if (exitMode.Equals(ExitMode.Console))
                {
                    Console.SetOut(sw);
                    Console.OutputEncoding = System.Text.Encoding.UTF8;
                    Console.Out.WriteLine("\n\nPressione uma tecla para continuar para o Semantico\n\n");
                    Console.ReadKey();
                }
                PrintSemantico(sem, lt, exitMode);
                break;

            case Output.SinSem:
                PrintSintatico(s, lt, exitMode);
                Console.Out.Close();
                sw = new StreamWriter(Console.OpenStandardOutput())
                {
                    AutoFlush = true
                };
                if (exitMode.Equals(ExitMode.Console))
                {
                    Console.SetOut(sw);
                    Console.OutputEncoding = System.Text.Encoding.UTF8;
                    Console.Out.WriteLine("\n\nPressione uma tecla para continuar para o Semantico\n\n");
                    Console.ReadKey();
                }
                PrintSemantico(sem, lt, exitMode);
                break;

            case Output.Lex:
                PrintLexico(t, exitMode);
                break;

            case Output.Sin:
                PrintSintatico(s, lt, exitMode);
                break;

            case Output.Sem:
                PrintSemantico(sem, lt, exitMode);
                break;

            default:
                PrintLexico(t, exitMode);
                Console.Out.Close();
                sw = new StreamWriter(Console.OpenStandardOutput())
                {
                    AutoFlush = true
                };
                if (exitMode.Equals(ExitMode.Console))
                {
                    Console.SetOut(sw);
                    Console.OutputEncoding = System.Text.Encoding.UTF8;
                    Console.Out.WriteLine("\n\nPressione uma tecla para continuar para o Sintatico\n\n");
                    Console.ReadKey();
                }
                PrintSintatico(s, lt, exitMode);
                Console.Out.Close();
                sw = new StreamWriter(Console.OpenStandardOutput())
                {
                    AutoFlush = true
                };
                if (exitMode.Equals(ExitMode.Console))
                {
                    Console.SetOut(sw);
                    Console.OutputEncoding = System.Text.Encoding.UTF8;
                    Console.Out.WriteLine("\n\nPressione uma tecla para continuar para o Semantico\n\n");
                    Console.ReadKey();
                }
                PrintSemantico(sem, lt, exitMode);
                break;
            }

            Console.Out.WriteLine("\n\n###Fim de processo###");
            Console.ReadKey();
            Console.Out.Close();
        }
        static void Main(string[] args)
        {
            List <string> Tokens       = new List <string>();
            List <string> definiciones = new List <string>();

            //Prueba
            Console.WriteLine("Please enter your text file path");
            String a      = Console.ReadLine();
            string text   = "";
            bool   errorB = true;
            string sample = System.IO.File.ReadAllText(a.ToString());

            string[] output = a.Split('.');
            var      defs   = new TokenDefinition[]
            {
                //comentarios
                new TokenDefinition(@"(/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+/)|^(//.*)", "T_Comentario"),
                new TokenDefinition(@"/\*.*", "Inicio_Coment"),
                new TokenDefinition(@".*\*/", "Final_Coment"),

                //string
                new TokenDefinition(@"([""'])(?:\\\1|.)*?\1", "T_string"),
                new TokenDefinition(@"^[\""].*", "Incomplete_String"),
                //numeros
                new TokenDefinition(@"[-+]?\d+\.\d*([eE][-+]?\d+)?", "T_DoubleConstant"),
                new TokenDefinition(@"[0][Xx][\d*a-fA-F]+", "T_Hexadecimal"),
                new TokenDefinition(@"[-+]?\d+", "T_IntConstant"),
                //true y false
                new TokenDefinition(@"[t][r][u][e]", "T_TRUE"),
                new TokenDefinition(@"[f][a][l][s][e]", "T_FALSE"),
                //PALABRAS RESERVADAS
                new TokenDefinition(@"[v][o][i][d](?![_A-Za-z\d]+)", "T_void"),
                new TokenDefinition(@"[i][n][t](?![A-Za-z\d_]+)", "T_int"),
                new TokenDefinition(@"[d][o][u][b][l][e](?![A-Za-z\d_]+)", "T_double"),
                new TokenDefinition(@"[b][o][o][l](?![A-Za-z\d_]+)", "T_bool"),
                new TokenDefinition(@"[s][t][r][i][n][g](?![A-Za-z\d_]+)", "T_string"),
                new TokenDefinition(@"[c][l][a][s][s](?![A-Za-z\d_]+)", "T_class"),
                new TokenDefinition(@"[c][o][n][s][t](?![A-Za-z\d_]+)", "T_const"),
                new TokenDefinition(@"[i][n][t][e][r][f][a][c][e](?![A-Za-z\d_]+)", "T_interface"),
                new TokenDefinition(@"[n][u][l][l](?![A-Za-z\d_]+)", "T_null"),
                new TokenDefinition(@"[t][h][i][s](?![A-Za-z\d_]+)", "T_this"),
                new TokenDefinition(@"[f][o][r](?![A-Za-z\d_]+)", "T_for"),
                new TokenDefinition(@"[w][h][i][l][e](?![A-Za-z\d_]+)", "T_while"),
                new TokenDefinition(@"[f][o][r][e][a][c][h](?![A-Za-z\d_]+)", "T_foreach"),
                new TokenDefinition(@"[i][f](?![A-Za-z\d_]+)", "T_if"),
                new TokenDefinition(@"[e][l][s][e](?![A-Za-z\d_]+)", "T_else"),
                new TokenDefinition(@"[r][e][t][u][r][n](?![A-Za-z\d_]+)", "T_return"),
                new TokenDefinition(@"[b][r][e][a][k](?![A-Za-z\d_]+)", "T_break"),
                new TokenDefinition(@"[N][e][w](?![A-Za-z\d_]+)", "T_New"),
                new TokenDefinition(@"[N][e][w][A][r][r][a][y](?![A-Za-z\d_]+)", "T_NewArray"),
                new TokenDefinition(@"[C][o][n][s][o][l][e](?![A-Za-z\d_]+)", "T_Console"),
                new TokenDefinition(@"[W][r][i][t][e][L][i][n][e](?![A-Za-z\d_]+)", "T_WriteLine"),
                //identificadores
                new TokenDefinition(@"[_A-Za-z][_A-Za-z0-9]{0,30}", "T_Identifier"),
                //Operadores y carcteres de puntuacion
                new TokenDefinition(@"\.", "."),
                new TokenDefinition(@"\+", "+"),
                new TokenDefinition(@"\-", "-"),
                new TokenDefinition(@"\*", "*"),
                new TokenDefinition(@"\/", "/"),
                new TokenDefinition(@"\:", ":"),

                new TokenDefinition(@"[<][=]", ">"),
                new TokenDefinition(@"\<", "<"),

                new TokenDefinition(@"[>][=]", ">="),
                new TokenDefinition(@"\>", ">"),

                new TokenDefinition(@"[!][=]", "!="),
                new TokenDefinition(@"[=][=]", "=="),
                new TokenDefinition(@"\=", "="),
                new TokenDefinition(@"\!", "!"),


                new TokenDefinition(@"[&&]", "&&"),
                new TokenDefinition(@"[|][|]", "||"),


                new TokenDefinition(@"[[][]]", "[]"),
                new TokenDefinition(@"\[", "["),
                new TokenDefinition(@"\]", "]"),

                new TokenDefinition(@"[(][)]", "()"),
                new TokenDefinition(@"\(", "("),
                new TokenDefinition(@"\)", ")"),


                new TokenDefinition(@"\s", "SPACE"),
                new TokenDefinition(@"\%", "%"),

                new TokenDefinition(@"[{][}]", "{}"),
                new TokenDefinition(@"\}", "}"),
                new TokenDefinition(@"\{", "{"),

                new TokenDefinition(@"\,", ","),
                new TokenDefinition(@"\;", ";"),
                //error
                new TokenDefinition(@".", "Error")
            };
            TextReader r = new StringReader(sample);
            lexer      l = new lexer(r, defs);

            while (l.Next())
            {
                if (l.Token.ToString() == "Inicio_Coment")
                {
                    errorB = false;
                }
                if (l.Token.ToString() == "Final_Coment" & !errorB)
                {
                    errorB = true;
                }
                if (l.Token.ToString() != "Error" && l.TokenContents.ToString().Length < 31 && l.Token.ToString() != "Incomplete_String")
                {
                    if (l.Token.ToString() != "SPACE" & l.Token.ToString() != "T_Comentario" & l.Token.ToString() != "Final_Coment" & errorB)
                    {
                        Tokens.Add(l.TokenContents);
                        definiciones.Add(l.Token.ToString());
                        text += l.TokenContents + " line " + l.LineNumber + " cols " + l.Position + " is " + l.Token + "\n\r";
                        System.IO.File.WriteAllText(output[0] + ".out", text);
                    }
                }
                else if (l.TokenContents.ToString().Length < 31 && l.Token.ToString() != "Incomplete_String")
                {
                    text += "*** Error line " + l.LineNumber + " *** Unrecognized char: " + l.TokenContents + "\n\r";
                    System.IO.File.WriteAllText(output[0] + ".out", text);
                }
                else if (l.Token.ToString() != "T_Comentario" && l.Token.ToString() != "Incomplete_String")
                {
                    text += "*** Error line " + l.LineNumber + " Secuencia mayor al limite permitido" + "\n\r";
                    System.IO.File.WriteAllText(output[0] + ".out", text);
                }
                else if (l.Token.ToString() == "Incomplete_String")
                {
                    text += "*** Error line " + l.LineNumber + " string sin terminar" + "\n\r";
                    System.IO.File.WriteAllText(output[0] + ".out", text);
                }
            }
            if (!errorB)
            {
                text += "*** Error line " + l.LineNumber + "*** EOF in unfinished comment: " + "\n\r";
                System.IO.File.WriteAllText(output[0] + ".out", text);
            }
            else if (l.Token.ToString() == "Incomplete_String")
            {
                text += "*** Error line " + l.LineNumber + "*** EOF in unfinished string: " + "\n\r";
                System.IO.File.WriteAllText(output[0] + ".out", text);
            }
            Console.WriteLine(text);
            Sintatico S = new Sintatico(Tokens, definiciones);

            Console.ReadKey();
        }
Exemple #6
0
        static void Main(string[] args)
        {
            string    readPath   = @"..\..\teste.txt";
            string    writePath  = @"..\..\writeTeste.txt";
            Hashtable dicionario = GetHashtable();

            // Como ler um arquivo linha por linha
            using (StreamWriter writeFile = new StreamWriter(writePath))
            {
                using (StreamReader readFile = new StreamReader(readPath))
                {
                    int    contador            = 1;
                    bool   comentario          = false;
                    int    coment_aberto_linha = 1;
                    string palavra             = "";
                    string tipo = "";
                    bool   comentarioNaoAberto  = false;
                    int    coment_fechado_linha = 1;

                    while (readFile.Peek() >= 0)
                    {
                        //Checa se o simbolo pertence a linguagem ou não
                        bool pertence  = false;
                        int  num_letra = readFile.Read();
                        //Quando pular linha somar contador "/r"
                        if (num_letra == 13)
                        {
                            contador++;
                            pertence = true;
                            continue;
                        }
                        //Caso seja "{", então abriu comentário
                        else if (num_letra == 123)
                        {
                            coment_aberto_linha = contador;
                            comentario          = true;
                            pertence            = true;
                            continue;
                        }
                        //Caso seja "}", então fechou comentário
                        else if (num_letra == 125)
                        {
                            if (!comentario)
                            {
                                comentarioNaoAberto  = true;
                                coment_fechado_linha = contador;
                            }
                            comentario = false;
                            pertence   = true;
                            continue;
                        }

                        if (!comentario)
                        {
                            //Ignorar caso seja um /n /t ou " "
                            if (num_letra == 32 || num_letra == 9 || num_letra == 10)
                            {
                                pertence = true;
                                continue;
                            }

                            //Caso seja "+" ou "-"
                            if (palavra.Equals("") && ((num_letra == 43) || (num_letra == 45)))
                            {
                                pertence = true;
                                char caractere = (char)num_letra;
                                palavra += caractere;
                                tipo     = "Aditivo";
                                if (!palavra.Equals(""))
                                {
                                    WriteOnText(writeFile, palavra, tipo, contador);
                                    palavra = "";
                                    tipo    = "";
                                }
                            }

                            //Caso seja "*" ou "/"
                            if (palavra.Equals("") && ((num_letra == 42) || (num_letra == 47)))
                            {
                                pertence = true;
                                char caractere = (char)num_letra;
                                palavra += caractere;
                                tipo     = "Multiplicativo";
                                if (!palavra.Equals(""))
                                {
                                    WriteOnText(writeFile, palavra, tipo, contador);
                                    palavra = "";
                                    tipo    = "";
                                }
                            }

                            //Caso seja um inteiro ou um real ou potencia
                            if (CheckIfNum(num_letra, palavra, tipo))
                            {
                                pertence = true;
                                char letra = (char)num_letra;
                                palavra += letra;

                                if (num_letra == 46)
                                {
                                    tipo = "Real";
                                }

                                if (num_letra == 69 || num_letra == 101)
                                {
                                    tipo = "QuasePotencia";
                                }

                                if (num_letra == 43 || num_letra == 45)
                                {
                                    tipo = "Potencia";
                                }

                                if (tipo.Equals(""))
                                {
                                    tipo = "Inteiro";
                                }

                                if (CheckIfNum(readFile.Peek(), palavra, tipo))
                                {
                                    continue;
                                }
                                else
                                {
                                    WriteOnText(writeFile, palavra, tipo, contador);
                                    palavra = "";
                                    tipo    = "";
                                }
                            }

                            //Caso seja um Delimitador ou um Relacional
                            if (palavra.Equals("") || tipo.Equals("Relacional"))
                            {
                                bool podeImprimir = true;
                                switch (num_letra)
                                {
                                // DELIMITADORES
                                //";" (PONTO E VIRGULA)
                                case 59:
                                    pertence = true;
                                    palavra += (char)num_letra;
                                    tipo     = "Delimitador";
                                    break;

                                //"." (PONTO)
                                case 46:
                                    pertence = true;
                                    palavra += (char)num_letra;
                                    tipo     = "Delimitador";
                                    break;

                                //":" (DOIS PONTOS)
                                case 58:
                                    pertence = true;
                                    palavra += (char)num_letra;
                                    if (CheckIfAssignment(readFile.Peek()))
                                    {
                                        tipo = "Atribuição";
                                        continue;
                                    }
                                    else
                                    {
                                        tipo = "Delimitador";
                                    }
                                    break;

                                //"(" (ABRE PARENTESIS)
                                case 40:
                                    pertence = true;
                                    palavra += (char)num_letra;
                                    tipo     = "Delimitador";
                                    break;

                                //"(" (FECHA PARENTESIS)
                                case 41:
                                    pertence = true;
                                    palavra += (char)num_letra;
                                    tipo     = "Delimitador";
                                    break;

                                //"," (VIRGULA)
                                case 44:
                                    pertence = true;
                                    palavra += (char)num_letra;
                                    tipo     = "Delimitador";
                                    break;

                                // RELACIONAIS
                                //"=" (IGUAL)
                                case 61:
                                    pertence = true;
                                    palavra += (char)num_letra;
                                    tipo     = "Relacional";
                                    break;

                                //"<" (MENOR)
                                case 60:
                                    pertence = true;
                                    palavra += (char)num_letra;
                                    tipo     = "Relacional";
                                    //"<=" (MENOR IGUAL) ou "<>" (DIFERENTE)
                                    if ((readFile.Peek() == 61) || (readFile.Peek() == 62))
                                    {
                                        podeImprimir = false;
                                        continue;
                                    }
                                    break;

                                //">" (MAIOR)
                                case 62:
                                    pertence = true;
                                    palavra += (char)num_letra;
                                    tipo     = "Relacional";
                                    //">=" (MAIOR IGUAL)
                                    if (readFile.Peek() == 61)
                                    {
                                        podeImprimir = false;
                                        continue;
                                    }
                                    break;
                                }

                                if (tipo.Equals("Delimitador"))
                                {
                                    WriteOnText(writeFile, palavra, tipo, contador);
                                    palavra = "";
                                    tipo    = "";
                                    continue;
                                }

                                if (podeImprimir && tipo.Equals("Relacional"))
                                {
                                    WriteOnText(writeFile, palavra, tipo, contador);
                                    palavra = "";
                                    tipo    = "";
                                }
                            }

                            if (tipo.Equals("Atribuição") && CheckIfAssignment(num_letra))
                            {
                                pertence = true;
                                palavra += (char)num_letra;
                                WriteOnText(writeFile, palavra, tipo, contador);
                                palavra = "";
                                tipo    = "";
                            }

                            if (CheckIfId(num_letra, palavra, tipo))
                            {
                                pertence = true;
                                palavra += (char)num_letra;

                                if (tipo.Equals(""))
                                {
                                    tipo = "Identificador";
                                }

                                if (CheckIfId(readFile.Peek(), palavra, tipo))
                                {
                                    continue;
                                }
                                else
                                {
                                    tipo = CheckIfDic(palavra, dicionario);
                                    WriteOnText(writeFile, palavra, tipo, contador);
                                    palavra = "";
                                    tipo    = "";
                                }
                            }
                            if (!pertence)
                            {
                                tipo     = "Nao pertencente";
                                palavra += (char)num_letra;
                                WriteOnText(writeFile, palavra, tipo, contador);
                                palavra = "";
                                tipo    = "";
                            }
                        }
                    }
                    if (comentarioNaoAberto)
                    {
                        Console.Error.WriteLine("\nComentário fechado e não aberto na linha: " + coment_fechado_linha);
                    }
                    if (comentario)
                    {
                        Console.Error.WriteLine("\nComentário aberto e não fechado na linha: " + coment_aberto_linha);
                    }
                    readFile.Close();
                    Console.WriteLine($"File has {contador} lines.");
                }
                writeFile.Close();
            }

            Sintatico syntacticAnalyzer = new Sintatico();

            syntacticAnalyzer.Program();
        }