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)); } }
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); } }
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(); }
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(); }