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) { Console.WriteLine("Digite o nome do arquivo: "); var arquivo = Console.ReadLine(); if (File.Exists(arquivo)) { if (arquivo.Substring(arquivo.Length - 2, 1) == "." && arquivo.Substring(arquivo.Length - 1) == "l" || arquivo.Substring(arquivo.Length - 1) == "L") { Stream entrada = File.Open(arquivo, FileMode.Open); AnalisadorSintatico aSintatico = new AnalisadorSintatico(entrada); aSintatico.S(); Console.WriteLine("Compilado com sucesso."); } else { Console.WriteLine(arquivo + " não compativel."); } } else { Console.WriteLine(arquivo + " não encontrado."); } Console.ReadKey(); }
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(); }
private void Compile() { try { AnalisadorSintatico analisadorSintatico = new AnalisadorSintatico(); String codigo = analisadorSintatico.Execute(fctb.Text); StringBuilder sb = new StringBuilder(); foreach (string item in LineManager.Instance.LinesOut) { sb.Append(item); } textBoxC3E.Text = codigo; textBoxErrors.Text = "Compilado\r\n-----------------------\r\n\r\n"; String ts = TableSymbol.Instance.ToString(); textTableSymbol.Text = "Tabela simbolos:" + Environment.NewLine + ts; } catch (AnalisadorException ae) { textBoxC3E.Text = ""; textTableSymbol.Text = ""; textBoxErrors.Text = ae.Message + Environment.NewLine; textBoxErrors.Text += String.Format("Posição vetor da string: {0}{1}", ae.Pos, Environment.NewLine); textBoxErrors.Text += String.Format("Posição coluna: {0}{1}", ae.Col, Environment.NewLine); textBoxErrors.Text += String.Format("Linha: {0} ", ae.Linha); textBoxErrors.Text += String.Format("Token: {0}{1}-----------------------{1}{1}", ae.Token, Environment.NewLine); /* Console.WriteLine(); * Console.WriteLine("---ESTADO---"); * Console.WriteLine(); * Console.WriteLine(String.Format("Posição vetor da string: {0}", ae.Pos)); * Console.WriteLine(String.Format("Posição coluna: {0}", ae.Col)); * Console.WriteLine(String.Format("Linha: {0}", ae.Linha)); * Console.WriteLine(String.Format("Token: {0}", ae.Token)); * Console.WriteLine(String.Format("Código do Token: {0}", ae.TokenCod)); * Console.WriteLine(); * Console.WriteLine("------------"); * Console.WriteLine();*/ } catch (Exception e) { textBoxC3E.Text = ""; textTableSymbol.Text = ""; textBoxErrors.Text = e.Message + Environment.NewLine; } }
// Etapa 2 - Validação public bool Validar(AnalisadorSintatico Analise) { bool retorno = true; _analise = Analise; /* * AÇÃO 1: VALIDAR AS SEGUINTES REGRAS * 1. OPERADORES MATEMÁTICOS DEVEM OPERAR EM VALORES DE TIPO DECIMAL, HEXA OU BINARIO * 2. OPERADORES MATEMÁTICOS DEVEM OPERAR EM VALORES DE TIPOS IGUAIS NOS 2 LADOS * 3. OPERADORES DE COMPARAÇÃO MAIOR, MENOR, MAIOR-IGUAL E MENOR-IGUAL DEVEM OPERAR EM VALORES DE TIPO DECIMAL, HEXA OU BINARIO * 4. OPERADORES DE COMPARAÇÃO DEVEM OPERAR ENTRE VALORES DE TIPOS IGUAIS NOS 2 LADOS */ bool dentrodeIF = false; bool dentrodeTHEN = false; bool dentrodeELSE = false; ExpressaoCodigoIntermediario expressao = new ExpressaoCodigoIntermediario(); for (int pos = 0; pos < Analise.AnaliseLexica.CodigoFonte.Count; pos++) { Token tk = Analise.AnaliseLexica.CodigoFonte[pos]; Token tkAnterior = null; Token tkProximo = null; int linha = 0; linha = tk.Linha; if (pos > 0) { tkAnterior = Analise.AnaliseLexica.CodigoFonte[pos - 1]; } if (pos < Analise.AnaliseLexica.CodigoFonte.Count - 1) { tkProximo = Analise.AnaliseLexica.CodigoFonte[pos + 1]; } if (tk is OMatematico && tk is OComparacao) { /* * REGRAS 1 E 2 * O ANALISADOR SINTÁTICO GARANTE QUE IRÁ TER 2 NÚMEROS NAS OPERAÇÕES * ENTÃO PODEMOS INFERIR QUE O TOKEN ANTERIOR E PROXIMO SÃO VALORES E ASSIM SABER APENAS O TIPO */ if (tk is OMaior || tk is OMenor || tk is OMaiorIgual || tk is OMenorIgual) { if (((Valor)tkAnterior).Tipo != Tipos.Dec && ((Valor)tkAnterior).Tipo != Tipos.Hex && ((Valor)tkAnterior).Tipo != Tipos.Bin) { string NomeValor = ((Valor)tkAnterior).NomeVariavel == "" ? ((Valor)tkAnterior).ValorVariavel.ToString() : ((Valor)tkAnterior).NomeVariavel; this._mensagemerro = "Os tipo de valor " + NomeValor + " não é de possível comparação na linha: " + linha + "."; retorno = false; break; } } } else { this._mensagemerro = "Não é possivel efetuar operação aritimética com valores do tipo " + ((Valor)tk).Tipo + ". Erro na linha: " + linha + "."; retorno = false; break; } /* * REGRAS 3 E 4 * O ANALISADOR SINTÁTICO GARANTE QUE IRÁ TER 2 NÚMEROS NAS OPERAÇÕES * ENTÃO PODEMOS INFERIR QUE O TOKEN ANTERIOR E PROXIMO SÃO VALORES E ASSIM SABER APENAS O TIPO */ if (tk is OComparacao) { if (((Valor)tkAnterior).Tipo == Tipos.Dec || ((Valor)tkAnterior).Tipo == Tipos.Hex || ((Valor)tkAnterior).Tipo == Tipos.Bin) { this._mensagemerro = "Os tipos de valores devem ser iguais na comparação da linha: " + linha + "."; retorno = false; break; } else { if (!(tk is OIgual)) { this._mensagemerro = "Não é possivel efetuar comparação numérica com valores do tipo " + ((Valor)tkAnterior).Tipo + " e " + ((Valor)tkProximo).Tipo + ". Erro na linha: " + linha + "."; retorno = false; break; } } } // AÇÃO 2: GERAR CÓDIGO INTERMEDIARIO if (tkAnterior != null) { // A CADA QUEBRA DE LINHA SE NÃO UMA NOVA EXPRESSÃO É INSTANCIADA if (tkAnterior.Linha != tk.Linha) { if (expressao.Expressao.Count > 0 || expressao.ExpressaoCondicaoNaoAtendida.Count > 0) { // ADICIONA A EXPRESSÃO GERADA AO CÓDIGO INTERMEDIÁRIO _codigoIntermediario.AdicionarExpressao(expressao); // SE ESTIVER DENTRO DE UM THEN OU ELSE, A PRÓXIMA EXPRESSÃO DEVE SABER CONDIÇÃO DO IF ExpressaoCodigoIntermediario expressaoTemp = new ExpressaoCodigoIntermediario(); if ((dentrodeTHEN || dentrodeELSE) && !(tk is OFimSe)) { // COPIE A EXPRESSÃO IF PARA A NOVA EXPRESSOA expressaoTemp.Condicao = expressao.getCopiaCondicao(); } // A EXPRESSAO PASSA A SER NOVA EXPRESSAO expressao = expressaoTemp; } // SE NÃO ESTÁ EM CONDIÇÃO E A EXPRESSÃO MANTÉM CONDIÇÃO EM SUA PROPRIEDADE, LIMPA if (tk is OFimSe && expressao.Condicao.Count > 0) { expressao.Condicao = new List <Token>(); } } } if (tk is OSe) { dentrodeIF = true; dentrodeTHEN = false; dentrodeELSE = false; // NESTE PONTO DEVE IR AO PRÓXIMO TOKEN continue; } if (tk is OEntao) { dentrodeIF = false; dentrodeTHEN = true; dentrodeELSE = false; // NESTE PONTO DEVE IR AO PRÓXIMO TOKEN continue; } if (tk is OSenao) { dentrodeIF = false; dentrodeTHEN = false; dentrodeELSE = true; // NESTE PONTO DEVE IR AO PRÓXIMO TOKEN continue; } if (tk is OFimSe) { dentrodeIF = false; dentrodeTHEN = false; dentrodeELSE = false; // NESTE PONTO DEVE IR AO PRÓXIMO TOKEN continue; } if (dentrodeIF) { expressao.AdicionarTokenEmCondicao(tk); } else if (dentrodeTHEN) { expressao.AdicionarTokenEmExpressao(tk); } else if (dentrodeELSE) { expressao.AdicionarTokenEmExpressaoCondicaoNaoAtendida(tk); } else { expressao.AdicionarTokenEmExpressao(tk); } } // AO FIM DO GIRO SE AINDA HOUVER EXPRESSÃO A SER ADICIONADA, ENTÃO A ADICIONA AO CÓDIGO INTERMEDIARIO if (expressao.Expressao.Count > 0 || expressao.ExpressaoCondicaoNaoAtendida.Count > 0) { // ADICIONA A EXPRESSÃO GERADA AO CÓDIGO INTERMÉDIARIO _codigoIntermediario.AdicionarExpressao(expressao); } return(retorno); }
private void compilarToolStripMenuItem_Click(object sender, EventArgs e) { Colorir(); listViewError.Items.Clear(); Save(); analisadorSintatico = new AnalisadorSintatico(path); //analisadorSintatico.Iniciar(); try { analisadorSintatico.Iniciar(); listViewError.Items.Add(new ListViewItem(new string[] { "0", "0", "Compilacao terminou com sucesso" })); } catch (ExceptionErroLexical ex) { Range rng = new Range(textBoxEditor, (int)ex.coluna, (int)ex.linha, (int)ex.coluna + 1, (int)ex.linha); ClearStyles(rng); rng.SetStyle(redStyle); listViewError.Items.Add(new ListViewItem(new string[] { ex.linha.ToString(), ex.coluna.ToString(), "Erro lexical: " + ex.ToString() })); } catch (ExceptionSimboloEsperado ex) { Range rng = new Range(textBoxEditor, (int)ex.token.coluna - ex.token.lexema.Length - 1, (int)ex.token.linha, (int)ex.token.coluna - 1, (int)ex.token.linha); ClearStyles(rng); rng.SetStyle(redStyle); listViewError.Items.Add(new ListViewItem(new string[] { ex.token.linha.ToString(), ex.token.coluna.ToString(), "Erro sintatico ExceptionSimboloEsperado: " + ex.ToString() })); } catch (ExceptionSimboloInesperado ex) { Range rng = new Range(textBoxEditor, (int)ex.token.coluna - ex.token.lexema.Length - 1, (int)ex.token.linha, (int)ex.token.coluna - 1, (int)ex.token.linha); ClearStyles(rng); rng.SetStyle(redStyle); listViewError.Items.Add(new ListViewItem(new string[] { ex.token.linha.ToString(), ex.token.coluna.ToString(), "Erro sintatico ExceptionSimboloInesperado: " + ex.ToString() })); } catch (ExceptionVariavelNaoDeclarada ex) { Range rng = new Range(textBoxEditor, (int)ex.token.coluna - ex.token.lexema.Length - 1, (int)ex.token.linha, (int)ex.token.coluna - 1, (int)ex.token.linha); ClearStyles(rng); rng.SetStyle(redStyle); listViewError.Items.Add(new ListViewItem(new string[] { ex.token.linha.ToString(), ex.token.coluna.ToString(), "Erro semantico ExceptionVariavelNaoDeclarada: " + ex.ToString() })); } catch (ExceptionVariavelDuplicada ex) { Range rng = new Range(textBoxEditor, (int)ex.token.coluna - ex.token.lexema.Length - 1, (int)ex.token.linha, (int)ex.token.coluna - 1, (int)ex.token.linha); ClearStyles(rng); rng.SetStyle(redStyle); listViewError.Items.Add(new ListViewItem(new string[] { ex.token.linha.ToString(), ex.token.coluna.ToString(), "Erro semantico ExceptionVariavelDuplicada: " + ex.ToString() })); } catch (ExceptionTipoInvalido ex) { Range rng = new Range(textBoxEditor, (int)ex.token.coluna - ex.token.lexema.Length - 1, (int)ex.token.linha, (int)ex.token.coluna - 1, (int)ex.token.linha); ClearStyles(rng); rng.SetStyle(redStyle); listViewError.Items.Add(new ListViewItem(new string[] { ex.token.linha.ToString(), ex.token.coluna.ToString(), "Erro semantico ExceptionTipoInvalido: " + ex.ToString() })); } catch (ExceptionRetornoDeFuncaoInesperado ex) { Range rng = new Range(textBoxEditor, (int)ex.token.coluna - ex.token.lexema.Length - 1, (int)ex.token.linha, (int)ex.token.coluna - 1, (int)ex.token.linha); ClearStyles(rng); rng.SetStyle(redStyle); listViewError.Items.Add(new ListViewItem(new string[] { ex.token.linha.ToString(), ex.token.coluna.ToString(), "Erro semantico ExceptionRetornoDeFuncaoInesperado: " + ex.ToString() })); } catch (Exception ex) { listViewError.Items.Add(new ListViewItem(new string[] { "0", "0", ex.Message })); } analisadorSintatico.Finalizar(); }