Analisador Léxico

Bom dia pessoal!
Desenvolvi no semestre passado um analisador Léxico se alguém quiser  estou postando aqui como se faz espero que gostem!

TELA PRINCIPAL


Essa é a tela inicial do sistema, quando o usuário abrir o programa ela aparecerá. Os componentes usados foram:
·         Um MenuStrip - (Incluir Alfabeto, Sair; Compilador; Sair)
·         WebBrowser
Essa tela é bem simples mesmo não tem segredo, e quase não tem código. Nessa tela é onde se chama as outras telas do sistema, tudo de maneira padrão.
namespace Compilador
{
    public partial class Principal : Form
    {
        public Principal()
        {
            InitializeComponent();
        }
        //Chama a tela de Alfabeto.
        private void cadastroDoDicionarioToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Alfabeto frm = new Alfabeto();
            frm.Show();          
        }
        //Sai do sistema
        private void sairToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Close();
        }

        private void sairToolStripMenuItem1_Click(object sender, EventArgs e)
        {
            Close();
        }

        private void compilarToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Compilador frm = new Compilador();
            frm.Show(); 
        }
     
    }
} 

TELA  CADASTRO DE ALFABETO


Essa tela foi feita para o usuário antes de cadastrar um novo token ter saber quais são os que já têm assim não cadastrando o mesmo nome duas vezes. Nessa tela o usuário além de cadastrar um novo token e ver quais os tokens cadastrados, ele pode também pesquisar o todos os tokens que tem o mesmo nome, somente clicando no nome que ele quer pesquisar e pressionando o botão Pesquisar. Para fazer essa tela foram usados os seguintes componentes:
·         Três Textbox – (txtCodigo, txtToken e txtDescrição).
·         Seis Buttons – (Atualizar, Adicionar, Limpar, Salvar, Pesquisar e Sair).
·         Três Labels – (Código, Token e Descrição).
·         Um DataGridView
·         Um MenuStrip

ATUALIZAR


Vamos começar a explicar a função do botão de atualizar que deve ser o primeiro a ser usado pelo usuário. Esse comando seleciona os dados que estão no banco e os seus códigos, e mostra na tela (DataGridView) para o usuário ver e usar. Como mostrado na imagem acima. E logo abaixo eu coloquei uma função que eu fiz para aparecer os dados do grid no textbox.
  //Atualiza e mostra no grid
        private void btnAtualizar_Click(object sender, EventArgs e)
        {
            //Pega o ID
            int codigo = Conexao.ProximoID("GD_COMPILADOR");

            //Atualiza e mostra no grid
            StringBuilder sql = new StringBuilder();
            sql.Append("select * from dicionario order by codigo");
            gdvDados.DataSource = Conexao.RetornaTabela("select * from dicionario order by codigo");
        }

//Passando os dados do Grid para os textbox
        private void gdvDados_Click(object sender, EventArgs e)
        {
            if (gdvDados.DataSource != null)
            {
                if (gdvDados[0, gdvDados.CurrentRow.Index].Value.ToString() != "")
                {
                    txtCodigo.Text = gdvDados[0, gdvDados.CurrentRow.Index].Value.ToString();
                    txtToken.Text = gdvDados[1,
gdvDados.CurrentRow.Index].Value.ToString();
                    txtDescricao.Text = gdvDados[2, gdvDados.CurrentRow.Index].Value.ToString();
                }
            }
        }

ADICIONAR


O botão de adicionar é simples também, o usuário digita o nome do token que quer cadastrar e a descrição dele, depois é só clicar no botão de adicionar que ele coloca um código automático e aparece no grid. O código faz isso ai que esta escrito, foi criada uma variável inteira chamada código pra receber a função ProximoID e passado o gerador que trará o código. Esse código da um insert na tabela dicionário e passa os parâmetros para o banco e ser inserido, no final da um select na tabela e mostra os dados no Grid.
//Adicionar
        private void btnAdicionar_Click(object sender, EventArgs e)
        {
            //Pega o ID
            int codigo = Conexao.ProximoID("GD_COMPILADOR");

            //Insere no banco de dados
            StringBuilder sql = new StringBuilder();
            sql.Append("Insert into dicionario (codigo,nome,descricao) values (@codigo,@nome,@descricao)");
            List<FbParameter> _param = new List<FbParameter>();
            _param.Add(new FbParameter("codigo", codigo));
            _param.Add(new FbParameter("nome", txtToken.Text));
            _param.Add(new FbParameter("descricao", txtDescricao.Text));
            Conexao.ExecutarComando(sql.ToString(), _param);
            gdvDados.DataSource = Conexao.RetornaTabela("select * from dicionario order by codigo");
        }

LIMPAR


Esse é o botão mais simples de todos, ele simplesmente limpa os textbox, poderia ter feito de uma função para limpar os textbox e tudo mais, porém não via a necessidade já que só tenho três textbox, então foi do jeito comum mesmo. O código é esse:
//Limpar      
 private void btnLimpar_Click(object sender, EventArgs e)
        {
            txtToken.Clear();
            txtCodigo.Clear();
            txtDescricao.Clear();
        }

SALVAR


O botão de salvar ele poderia ser chamado também de alterar porque tem a mesma função. Quando o usuário quiser alterar alguma palavra ele não precisa exclui – lá e escreve – lá novamente, simplesmente clica em cima dela, e altera o token ou a descrição nos textbox e clica em salvar, automaticamente é atualizada a palavra que estava escrita no banco pela que o usuário acabou de escrever e no final é dado um select no banco.

//Salvar uma alteração
        private void btnSalvar_Click(object sender, EventArgs e)
        {
            StringBuilder sql = new StringBuilder();
            sql.Append("UPDATE dicionario SET nome = @nome, descricao = @descricao WHERE codigo = @codigo");
            List<FbParameter> _param = new List<FbParameter>();
            _param.Add(new FbParameter("codigo", txtCodigo.Text));
            _param.Add(new FbParameter("nome", txtToken.Text));
            _param.Add(new FbParameter("descricao", txtDescricao.Text));
            Conexao.ExecutarComando(sql.ToString(), _param);
            gdvDados.DataSource = Conexao.RetornaTabela("select * from dicionario order by codigo");
        }

PESQUISAR


O botão de pesquisar é bem interessante e pode ser usado de duas maneiras a primeira é como vemos na tela acima o usuário digita a palavra e o sistema procura outras palavras iguais a que esta escrita no textbox token. A segunda maneira é clicando em cima da palavra e depois em pesquisar, automaticamente ele já retorna as palavras iguais. Lembrando q o c# é case sensitive e eu não mudei o sistema, para diferenciar maiúsculas de minúsculas.

//Pesquisar dados na tabela.
        private void btnPesquisar_Click(object sender, EventArgs e)
        {
            String sql;
            if (txtToken.Text == "")//Se txtToken estiver vazio
            {
                sql = "select * from DICIONARIO order by codigo";//esse comando vai selecionar todos os dados da tabela e mostrar no grid
            }
            else//senão extiver vazio
            {
                //esse comando vai procurar no banco todos os nomes iguais ao q esta no txtbox
                sql = "select * from DICIONARIO where NOME = '" + txtToken.Text + "' order by codigo";
            }
            gdvDados.DataSource = Conexao.RetornaTabela(sql);//aparece o resultado no textbox
        }

AJUDA


Para o usurário ter acesso a essas informações é só ele clicar em ajudar e depois ir a Instruções do Sistema. O código usado foi:
//Instruções de como usar o sistema
        private void instruçõesDoSistemaToolStripMenuItem_Click(object sender, EventArgs e)
        {
            MessageBox.Show("Instruções para um melhor uso do sistema, siga as intruções abaixo:" + ("\n") +
                             "1º Comece atualizando o sistema" + ("\n") +
                             "2º Digite o nome do novo token e clique em adicionar" + ("\n") +
                             "3º Para digitar um novo token, clique no botão de limpar e repita o 2º passo");

        }

SAIR


O botão de sair como o nome já diz, sai do sistema ou seja da tela que o usuário esta olhando naquele momento, o código é o básico mesmo.
//Sair do Sistema
        private void btnSair_Click(object sender, EventArgs e)
        {
            Close();
        }



TELA COMPILADOR



Essa é a tela do compilador do sistema, a parte que o mais esperada do sistema inteiro, é aqui que realmente precisa funcionar. Para não ficar tão simples essa tela tão importante nós programamos alguns códigos a mais, para embelezar o sistema.
·         Um TextBox com a função Multiline (txtEscreve).
·         Quatro Buttons (Compilar, Limpar, Plano de fundo e Sair).
·         Um ColorDialog.
Essa tela não tem muito segredo não. No textbox será escrito o código. E ao clicar no botão de compilar será feito a verificação do código, se os tokens que estão escritos no textbox, estão guardados no banco de dados.



COMPILAR


No botão de compilar foi criada uma função que valida o token, ou seja, essa função vai ao banco e compara a palavra escrita na tela com a do banco. Assim sendo, foi feito dois if um que diz envia uma mensagem dizendo que o token não está no banco de dados, e outro que confirma o cadastro do token no banco.
private void btnCompila_Click(object sender, EventArgs e)
        {
            //O replace substitui um caracter por outro, nesse caso irá substituir quebra de linha por um espaço, dois espaços por um, e caracteres especiais por espaço.
            string algoritmo = txtEscreve.Text.Replace("\n", " ").Replace("\r", "").Replace("  ", " ");
            string[] vetor = algoritmo.Split(' ');
            Boolean erro = false;
            for (int i = 0; i < vetor.Length; i++)
            {
                if (!validaToken(vetor[i].ToString()))
                {
                    erro = true;
                    MessageBox.Show(" O erro está " + (vetor[i].ToString()));
                    i = vetor.Length + 1;
                }
            }
            if (erro == false)
            {
                MessageBox.Show(" Processo realizado com sucesso ");
            }
        }
        //Função pra validar
        private Boolean validaToken(string token)
        {
            DataTable dt = new DataTable();
            dt = Conexao.RetornaTabela("select count(*) from DICIONARIO where NOME = '" + token + "'");
            if (int.Parse(dt.Rows[0][0].ToString()) >= 1)
            {
                return true;
            }
            else
            {
                return false;
            }
        }

LIMPAR



Esse é o botão mais simples de todos, ele simplesmente limpa os textbox O código é esse:
//Limpa a tela
        private void btnLimpa_Click(object sender, EventArgs e)
        {
            txtEscreve.Clear();
        }

PLANO DE FUNDO


Esse é o botão também tem uma função bem simples, e um pouco desconhecida porque foi bem difícil achar algo que levasse a ideia dessa função. Ela foi feita só pra embelezar o programa mesmo.



Como eu disse no começo desse trabalho foi usado um ColorDialog que ira abrir a caixa de cores, quando o usuário escolher a cor e clicar em ok será colocada a cor no fundo da tela, ou seja, no txtEscreve.
//Mudar a cor do Fundo
        private void PlanoDeFundo_Click(object sender, EventArgs e)
        {
            colorDialog1.ShowDialog();
            txtEscreve.BackColor = colorDialog1.Color;
        } 

SAIR


  O botão de sair como o nome já diz, sai do sistema ou seja da tela que o usuário esta olhando naquele momento, o código é o básico mesmo.
//Fechar
        private void btnSair_Click(object sender, EventArgs e)
        {
            Close();
        }
    }
}


É um modelo bem simples mais eu espero que tenham gostado, qualquer dúvida é só perguntar.


4 comentários

  1. boa vivi tirou as minhas duvidas vlw
    muito bom o conteúdo
    abraço

    ResponderExcluir
  2. vc tem ele em .rar ou .zip, todo o projeto?

    se tiver me envia para diegojlopes@hotmail.com

    ResponderExcluir
  3. Oi estou criando um analisador lexico tambem, voce poderia me ajudar? Estou com muitas dificuldades.

    Um abraço!

    ResponderExcluir

Topo