private void btnLexica_Click(object sender, EventArgs e) { AnalisadorLexico Al = new AnalisadorLexico(); if (Al.Validar(txtCodigo.Text, variaveis.ListaVariaveis)) { AnalisadorSintatico Asin = new AnalisadorSintatico(); if (Asin.Validar(Al)) { AnalisadorSemantico Asem = new AnalisadorSemantico(); if (Asem.Validar(Asin)) { dgvCodigo.DataSource = Asem.getCodigoIntermediario(); codigo = Asem.Codigo; } else { MessageBox.Show(Asem.MensagemErro); } } else { MessageBox.Show(Asin.MensagemErro); } } else { MessageBox.Show(Al.MensagemErro); } }
static void Main(string[] args) { AnalisadorLexico analisadorLexico = new AnalisadorLexico(true); analisadorLexico.ExtrairTokensLexicos("P1", "C://Files/a.txt", null); Console.ReadKey(); }
public void Entrada_vazia_retorna_nenhum_token() { //Arrange var analisadorLexico = new AnalisadorLexico(string.Empty); //Act var tokens = analisadorLexico.Analisar(); //Assert tokens.Should().Equal(new List <Token>()); }
public void Entrada_Identificador_Invalido() { //Arrange var analisadorLexico = new AnalisadorLexico("13212dasd"); //Act Action analisar = () => analisadorLexico.Analisar(); //Assert analisar.Should().Throw <CompiladorException>() .WithMessage("Identificador Inválido: 13212dasd \n Linha: 1"); }
public void EntradaInvalida() { //Arrange var analisadorLexico = new AnalisadorLexico(Helper.GetExemploIncorretoLalg()); analisadorLexico.Analisar(); var analisadorSintatico = new AnalisadorSintatico(analisadorLexico.Tokens); //Act Action analisar = () => analisadorSintatico.Analisar(); //Assert analisar.Should().Throw <CompiladorException>(); }
public void EntradaValida() { //Arrange var analisadorLexico = new AnalisadorLexico(Helper.GetExemploCorretoLalg()); analisadorLexico.Analisar(); var analisadorSintatico = new AnalisadorSintatico(analisadorLexico.Tokens); //Act Action analisar = () => analisadorSintatico.Analisar(); //Assert analisar.Should().NotThrow(); }
public void Entrada_Identificador_Invalido_Linha2() { //Arrange System.IO.File.WriteAllText("entrada.txt", "if numero > 1\n123abc"); var textoArquivo = System.IO.File.ReadAllText("entrada.txt"); var analisadorLexico = new AnalisadorLexico(textoArquivo); //Act Action analisar = () => analisadorLexico.Analisar(); //Assert analisar.Should().Throw <CompiladorException>() .WithMessage("Identificador Inválido: 123abc \n Linha: 2"); }
public void Entrada_Identificadores_Validos() { //Arrange var analisadorLexico = new AnalisadorLexico("if teste"); //Act var tokens = analisadorLexico.Analisar(); //Assert tokens.Should().Equal(new List <Token>() { new Token("if", ReservadoIf, 1), new Token("teste", Identificador, 1) }); }
static void Main(string[] args) { Console.WriteLine(Welcome); bool interromperProcesso = false; while (!interromperProcesso) { AnalisadorLexico analisador = new AnalisadorLexico(); AnalisadorLexicoEntrada entrada = new AnalisadorLexicoEntrada(); Console.WriteLine("Informe o caminho completo para o arquivo de entrada..."); string caminhoArquivoEntrada = Console.ReadLine(); FileInfo arquivoEntrada = null; if (!string.IsNullOrWhiteSpace(caminhoArquivoEntrada)) { arquivoEntrada = new FileInfo(caminhoArquivoEntrada.Replace("\"", "")); } if (arquivoEntrada != null && arquivoEntrada.Exists) { entrada.ArquivoFonte = arquivoEntrada; AnalisadorLexicoSaida saida = analisador.Processar(entrada, tokens); saida.GerarArquivos(entrada.ArquivoFonte); Console.WriteLine(""); Console.WriteLine("Processo de análise finalizado, hash de identificação {0}", saida.Identificador); } else { Console.WriteLine(""); Console.WriteLine("Arquivo de entrada não pode ser localizado"); } Console.WriteLine("Pressione qualquer tecla para continuar ou pressione ESC para sair..."); Console.WriteLine(""); interromperProcesso = Console.ReadKey().Key == ConsoleKey.Escape; } }
static void Main(string[] args) { try { if (args.Length > 0) { var analisador = new AnalisadorLexico(args[0]); analisador.Processar(); Console.WriteLine(analisador.Resultado); } else { Console.WriteLine("A execução do analisador deve ser: \"alex <fonte>\"\nonde <fonte> é o caminho do arquivo a ser analisado."); } } catch (Exception ex) { Console.WriteLine(ex.Message); } Console.ReadKey(); }
public static bool LetraDigitoSublinhado(this char caractere, AnalisadorLexico analisador) { return(caractere.Letra(analisador) || caractere.Digito(analisador) || (caractere.Equals('_'))); }
public static bool Simbolo(this char caractere, AnalisadorLexico analisador) { return(analisador.Simbolo.Contains(caractere)); }
public static bool Digito(this char caractere, AnalisadorLexico analisador) { return(analisador.Digito.Contains(caractere)); }
static void Main(string[] args) { Level level = Level.EXEC; Log.level = Level.EXEC; if (!LerArquivo(args)) { Log.println("Erro de leitura do arquivo fonte!", Level.EXEC); Console.ReadKey(); return; //sai do programa } //ANÁLISE LÉXICA AnalisadorLexico analisadorLexico = new AnalisadorLexico(file); analisadorLexico.Analisar(); if (analisadorLexico.TemErros()) { Log.println("Análise Léxica terminada com erro:", Level.DEBUG); analisadorLexico.MostraErros(); Console.ReadKey(); return; } else { Log.println("Análise Léxica terminada com sucesso!", Level.DEBUG); if (level == Level.DEBUG) { analisadorLexico.MostraTokens(); } } //ANÁLISE SINTÁTICA COM GERAÇÃO DE ÁRVORE AnalisadorSintaticoGeradorArvore analisadorSintatico = new AnalisadorSintaticoGeradorArvore(analisadorLexico.Tokens); analisadorSintatico.Analisar(); if (analisadorSintatico.TemErros()) { Log.println("Análise Sintática terminada com erro:", Level.DEBUG); analisadorSintatico.MostraErros(); Console.ReadKey(); return; } else { Log.println("Análise Sintática terminada com sucesso!", Level.DEBUG); if (level == Level.DEBUG) { analisadorLexico.MostraTokens(); TabelaSimbolos.MostraSimbolos(); } } //analisadorSintatico.MostraArvore(); AnalisadorSemantico analisadorSemantico = new AnalisadorSemantico(analisadorSintatico.Raiz); analisadorSemantico.Analisar(); if (analisadorSemantico.TemErros()) { Log.println("Análise Semântica terminada com erro:", Level.DEBUG); analisadorSemantico.MostraErros(); Console.ReadKey(); return; } else { Log.println("Análise Semântica terminada com sucesso!", Level.DEBUG); if (level == Level.DEBUG) { TabelaSimbolos.MostraSimbolos(); } } try { DateTime inicio = DateTime.Now; Interpretador interpretador = new Interpretador(analisadorSemantico.Raiz, args); //interpretador.Memoization = true; interpretador.Executar(); DateTime fim = DateTime.Now; Log.println("\n\nExecução encerrada com sucesso! Tempo gasto: " + fim.Subtract(inicio).TotalMilliseconds + " ms", Level.EXEC); } catch (Exception ex) { Log.println("Erro na interpretação: " + ex.Message, Level.EXEC); } Console.ReadKey(); }
public static bool LetraDigitoSimboloEspaco(this char caractere, AnalisadorLexico analisador) { return(caractere.Letra(analisador) || caractere.Digito(analisador) || caractere.Simbolo(analisador) || (caractere.Equals(' '))); }
public bool Validar(AnalisadorLexico Analise) { bool retorno = true; _analise = Analise; //*** ANÁLISE DAS POSIÇÕES DE CADA TOKEN SE ESTÁ CORRETO string lido = ""; int linha = 0; bool dentrodeIF = false; bool dentrodeTHEN = false; bool dentrodeELSE = false; bool ocorreuMudancaEstruturaIf = false; bool ocorreuOperadorMatematico = false; bool ocorreuOperadorComparacao = false; bool ocorreuOperadorLogico = false; string ConteudoIf = ""; string ConteudoThen_PorLinha = ""; string ConteudoElse_PorLinha = ""; for (int Pos = 0; Pos < Analise.CodigoFonte.Count; Pos++) { Token tk = Analise.CodigoFonte[Pos]; //*** VALIDA SE AS LINHAS NÃO COMEÇAM COM OPERADORES DE COMPARAÇÃO, MATEMATICOS OU LOGICOS (EXCETO IF/ELSE, ELSE/SENAO, ENDIF/FIMSE) //*** SE OCORREU MUDANÇA DE LINHA if (linha != tk.Linha) { lido = ""; //** SE O PRIMEIRO TOKEN DA LINHA É UM OPERADOR E NÃO O SE/IF, ENTÃO O SEU USO É INCORRETO if (tk is Operador && !(tk is OSe) && !(tk is OSenao) && !(tk is OFimSe)) { this._mensagemErro = "Erro de sintaxe: Uso incorreto do operador no inicio da expressão. Linha " + tk.Linha + "."; retorno = false; break; } } linha = tk.Linha; //*** VALIDA SE AS LINHAS NÃO TERMINAM COM OPERADORES DE COMPARAÇÃO, MATEMATICOS OU IF/ELSE //** SE NAO É O ULTIMO TOKEN if (Pos < Analise.CodigoFonte.Count - 1) { //*** RECUPERA QUAL SERÁ O PROXIMO TOKEN Token ProximoToken = Analise.CodigoFonte[Pos + 1]; //*** SE O PROXIMO TOKEN ESTA EM OUTRA LINHA ENTAO ELE É O PRIMEIRO TOKEN DA PROXIMA LINHA E // CONSEQUENTEMENTE ESTAMOS NO ULTIMO TOKEN if (ProximoToken.Linha != linha) { //*** SE FOR OPERADOR DE COMPARAÇÃO OU MATEMÁTICO OU IF/SE if (tk is OComparacao || tk is OMatematico || tk is OSe) { this._mensagemErro = "Erro de sintaxe: Uso incorreto do operador no final da expressão. Linha " + tk.Linha + "."; retorno = false; break; } } } //*** VALIDA SE SEGUE A SEQUENCIA VALOR -> OPERADOR -> VALOR if (tk is Valor) { if (lido == "" || lido == "O") { lido = "V"; } else { this._mensagemErro = "Erro de sintaxe: Simbolo " + ((Valor)tk).NomeVariavel + " Utilizado de forma incorreta na linha " + linha + "."; retorno = false; break; } } else if (tk is Operador) { if (lido == "" || lido == "V") { lido = "O"; } else { this._mensagemErro = "Erro de sintaxe: Operador utilizado de forma incorreta na linha " + linha + "."; retorno = false; break; } } //***VALIDA SE O IF/SE POSSUI UMA ESTRUTURA CORRETA ocorreuMudancaEstruturaIf = false; if (tk is OSe) { dentrodeIF = true; dentrodeTHEN = false; dentrodeELSE = false; ocorreuMudancaEstruturaIf = true; } if (tk is OEntao) { dentrodeIF = false; dentrodeTHEN = true; dentrodeELSE = false; ocorreuMudancaEstruturaIf = true; } if (tk is OSenao) { dentrodeIF = false; dentrodeTHEN = false; dentrodeELSE = true; ocorreuMudancaEstruturaIf = true; } if (tk is OFimSe) { dentrodeIF = false; dentrodeTHEN = false; dentrodeELSE = false; ocorreuMudancaEstruturaIf = true; } Token tkAnterior = null; Token tkProximo = null; if (Pos > 0) { tkAnterior = Analise.CodigoFonte[Pos - 1]; } if (Pos < Analise.CodigoFonte.Count - 1) { tkProximo = Analise.CodigoFonte[Pos + 1]; } //** REGRAS DE EXPRESSOES DENTRO DE IF, THEN E ELSE // 1. OPERADORES LÓGICOS SOMENTE DDEVEM OCORRER DENTRO DE IF if (tk is OLogico && !dentrodeIF) { this._mensagemErro = "Erro de sintaxe: Operador Lógico " + ((OLogico)tk).Cadeia.Valor + " fora de operador condicional na linha " + linha + "."; retorno = false; break; } // 2. VALIDA SE FORMATO DO IF ESTÁ CORRETO if (dentrodeIF) { //SE NESTA ÁREA HOUVER OPERADOR IF, COMPARACAO, MATEMATICO, LOGICO OU VALOR if (tk is OSe) { ConteudoIf += ((OSe)tk).Cadeia.Valor; } else if (tk is OComparacao) { ConteudoIf += ((OComparacao)tk).Cadeia.Valor; } else if (tk is OMatematico) { ConteudoIf += ((OMatematico)tk).Cadeia.Valor; } else if (tk is OLogico) { ConteudoIf += ((OLogico)tk).Cadeia.Valor; } else if (tk is Valor) { if (((Valor)tk).NomeVariavel != null) { ConteudoIf += ((Valor)tk).NomeVariavel; } else { ConteudoIf += ((Valor)tk).ValorVariavel; } } else { this._mensagemErro = "Erro de sintaxe: Operador Condicional " + new OSe().Cadeia.Valor + " com estrutura errada identificado na linha " + linha + "."; retorno = false; break; } //SEPARA AS PALAVRAS POR ESPAÇO ConteudoIf += " "; } //*** VALIDA O IF FEITO E TAMBEM SE O FORMATO DO THEN ESTA CORRETO else if (dentrodeTHEN) { if (ConteudoIf != "") { ConteudoIf += new OEntao().Cadeia.Valor; string ER = ExpressaoRegularSeEntao(); Match match = Regex.Match(ConteudoIf, ER); if (match.Success) { ConteudoIf = ""; } else { this._mensagemErro = "Erro de sintaxe: Operador Condicional " + new OSe().Cadeia.Valor + " com estrutura errada identificado na linha " + linha + "."; retorno = false; break; } } else { // SE NESTA ÁREA HOUVER OPERADOR COMPARACAO, MATEMATICO, LOGICO OU VALOR GUARDA PARA VALIDACAO NA QUEBRA DE LINHA, //SE NAO ESTA ERRADO if (tk is OComparacao) { ConteudoThen_PorLinha += ((OComparacao)tk).Cadeia.Valor; } else if (tk is OMatematico) { ConteudoThen_PorLinha += ((OMatematico)tk).Cadeia.Valor; } else if (tk is OLogico) { ConteudoThen_PorLinha += ((OLogico)tk).Cadeia.Valor; } else if (tk is Valor) { if (((Valor)tk).NomeVariavel != null) { ConteudoThen_PorLinha += ((Valor)tk).NomeVariavel; } else { ConteudoThen_PorLinha += ((Valor)tk).ValorVariavel; } } else { this._mensagemErro = "Erro de sintaxe: Operador Condicional " + new OEntao().Cadeia.Valor + " com estrutura errada identificado na linha " + linha + "."; retorno = false; break; } //*** A CADA MUDANÇA DE LINHA VALIDA SE AS LINHAS DO THEN POSSUI UMA ESTRUTURA DE EXPRESSAO CORRETA if (tkAnterior != null) { if ((!(tk is OEntao) && tk.Linha != tkProximo.Linha) || tkProximo is OSenao || tkProximo is OFimSe) { string ER = ExpressaoRegularExpressoes(); Match match = Regex.Match(ConteudoThen_PorLinha, ER); if (match.Success) { ConteudoElse_PorLinha = ""; } else { this._mensagemErro = "Erro de sintaxe: Operador Condicional " + new OEntao().Cadeia.Valor + " com expressao errada, identificada na linha " + linha + "."; retorno = false; break; } } } //SEPARA AS PLAVRAS POR ESPAÇO if (ConteudoElse_PorLinha != "") { ConteudoElse_PorLinha += " "; } } } else if (dentrodeELSE) { // SE NESTA ÁREA HOUVER OPERADOR COMPARACAO, MATEMATICO, LOGICO OU VALOR GUARDA PARA VALIDACAO NA QUEBRA DE LINHA, //SE NAO ESTA ERRADO if (tk is OComparacao) { ConteudoElse_PorLinha += ((OComparacao)tk).Cadeia.Valor; } else if (tk is OMatematico) { ConteudoElse_PorLinha += ((OMatematico)tk).Cadeia.Valor; } else if (tk is OLogico) { ConteudoElse_PorLinha += ((OLogico)tk).Cadeia.Valor; } else if (tk is Valor) { if (((Valor)tk).NomeVariavel != null) { ConteudoElse_PorLinha += ((Valor)tk).NomeVariavel; } else { ConteudoElse_PorLinha += ((Valor)tk).ValorVariavel; } } else { this._mensagemErro = "Erro de sintaxe: Operador Condicional " + new OSenao().Cadeia.Valor + " com simbolo nao reconhecido, identificado na linha " + linha + "."; retorno = false; break; } if (tkAnterior != null) { if ((!(tk is OSenao) && tk.Linha != tkProximo.Linha) || tkProximo is OFimSe) { if (ConteudoElse_PorLinha.Trim() != "") { string ER = ExpressaoRegularExpressoes(); Match match = Regex.Match(ConteudoElse_PorLinha, ER); if (match.Success) { ConteudoElse_PorLinha = ""; } else { this._mensagemErro = "Erro de sintaxe: Operador Condicional " + new OSenao().Cadeia.Valor + " com expressao errada identificado na linha " + linha + "."; retorno = false; break; } } } } //SEPARA AS PALAVRAS POR ESPAÇO if (ConteudoElse_PorLinha != "") { ConteudoElse_PorLinha += " "; } } else { if (ConteudoIf != "") { this._mensagemErro = "Erro de sintaxe: Operador Condicional " + new OSe().Cadeia.Valor + " sem fechamento do operador " + new OSenao().Cadeia.Valor + " ou " + new OFimSe().Cadeia.Valor + " identidicado na linha " + linha + "."; retorno = false; break; } } } return(retorno); }
public static bool Letra(this char caractere, AnalisadorLexico analisador) { return(analisador.Letra.Contains(caractere)); }
void Colorir() { if (path == null) { return; } ClearStyles(new Range(textBoxEditor, 0, 0, textBoxEditor.Lines[textBoxEditor.Lines.Count - 1].Length, textBoxEditor.Lines.Count - 1)); string pathTmp = path + ".tmp"; if (!File.Exists(pathTmp)) { File.Create(pathTmp); } File.WriteAllText(pathTmp, textBoxEditor.Text); using (StreamReader arquivo = new StreamReader(new FileStream(pathTmp, FileMode.Open))) { AnalisadorLexico lexico = new AnalisadorLexico(arquivo); try { //listBox1.Items.Clear(); while (!lexico.FimDeArquivo()) { var token = lexico.PegaToken(); //listBox1.Items.Add(token.linha + " " + token.lexema); Range rng = new Range(textBoxEditor, (int)token.coluna - token.lexema.Length - 1, (int)token.linha, (int)token.coluna - 1, (int)token.linha); if (token.simbolo == Simbolo.S_PROCEDIMENTO || token.simbolo == Simbolo.S_PROGRAMA || token.simbolo == Simbolo.S_FACA || token.simbolo == Simbolo.S_SE || token.simbolo == Simbolo.S_SENAO || token.simbolo == Simbolo.S_ENTAO || token.simbolo == Simbolo.S_VAR || token.simbolo == Simbolo.S_ENQUANTO || token.simbolo == Simbolo.S_FUNCAO) { rng.SetStyle(blueStyle); } if (token.simbolo == Simbolo.S_INICIO || token.simbolo == Simbolo.S_FIM) { rng.SetStyle(negritoStyle); } if (token.simbolo == Simbolo.S_NUMERO) { rng.SetStyle(salmonStyle); } if (token.simbolo == Simbolo.S_VERDADEIRO || token.simbolo == Simbolo.S_FALSO) { rng.SetStyle(salmonStyle); } if (token.simbolo == Simbolo.S_BOOLEANO || token.simbolo == Simbolo.S_INTEIRO || token.simbolo == Simbolo.S_E || token.simbolo == Simbolo.S_OU || token.simbolo == Simbolo.S_NAO || token.simbolo == Simbolo.S_DIV) { rng.SetStyle(blackItallicStyle); } } } catch { } arquivo.Close(); } using (StreamReader arquivo = new StreamReader(new FileStream(pathTmp, FileMode.Open))) { AnalisadorLexico lexico = new AnalisadorLexico(arquivo); while (!lexico.FimDeArquivo()) { if (lexico.c == '{') { int startL = (int)lexico.linha; int startC = (int)lexico.coluna - 1; while (lexico.c != '}' && !lexico.FimDeArquivo()) { lexico.c = lexico.Ler(); } int endL = (int)lexico.linha; int endC = (int)lexico.coluna; Range rng = new Range(textBoxEditor, startC, startL, endC, endL); ClearStyles(rng); rng.SetStyle(grayStyle); } lexico.c = lexico.Ler(); } arquivo.Close(); } }