Mini Analisador Léxico que conta palavras numa string
Publicado por Samuel Leonardo (última atualização em 23/04/2021)
[ Hits: 2.106 ]
Homepage: localhost
Neste programa está um código bem pequeno para contar palavras numa string. Com ele, você pode inclusive adaptar e contar palavras num arquivo txt, desde que não se use pontuações ou outros caracteres como \n e \t.
Eu fiz ele bem simples para apenas alguém se interessar pelo estudo de compiladores.
Sugiro a leitura dos livros:
- compiladores princípios técnicas e ferramentas (ótimo livro, muito prático)
- linguagens formais e autômatos do autor Paulo Blauth Menezes (muito teórico este livro)
Instruções:
- modifique a string 'str' para ver como se comporta o lexer
- leia os comentários para mais instruções
/** * @file minilexer.c * @author Samuel Leonardo * @brief Mini analisador léxico de uma string * @version 0.1 * @date 2021-04-20 * * @copyright Copyleft (c) 2021 * */ #include <stdio.h> #include <stdlib.h> #include <string.h> int main ( ) { //modifique esta string para ver se o analisador funciona //observe que, só coloquei o caractere ' ' (espaço) como separador das palavras //você pode modificar facilmente para outros caracteres como o \n \t etc e tal //NOTA: também não coloquei para ignorar pontuaçlão, por isso, //algo como "aqui," é encarado como uma palavra const char * str = "String teste Com Char MAIUSCULOS!"; //estado do analisador léxico int estado = 0; //posição do caractere atual int p = 0; int tamanho = strlen(str); int qtdePalavras = 0; while (str[p]) { //estado de lendo um caractere if (estado == 0) { if (str[p] != ' ') { //vai para estado de lendo identificador (palavra sem espaço) estado = 1; } else { // move a posição do caractere atual p++; } } // lendo um identificador else if (estado == 1) { int inicio = p; int fim = p + 1; while (str[fim] && str[fim] != ' ') { fim++; } //verifica agora se o fim NÃO é o char '\0' ou um ' ' (espaço) if (str[fim] == '\0' || str[fim] == ' ') { // se estamos aqui, é de se supor que estamos lendo um caractere do alfabeto // seria mais interessante ter verificado isso no if daqui // agora, incrementa o contador de palavras qtdePalavras++; } // depois, posiciona o contador de posição na posição do fim p = fim; // volta ao estado de lendo caractere estado = 0; } } printf("Frase: %s \n\tem %d palavras\n", str, qtdePalavras); return 0; }
Formatar strings em C (RG, telefone, CEP etc)
Enviar mensagem ao usuário trabalhando com as opções do php.ini
Meu Fork do Plugin de Integração do CVS para o KDevelop
Compartilhando a tela do Computador no Celular via Deskreen
Como Configurar um Túnel SSH Reverso para Acessar Sua Máquina Local a Partir de uma Máquina Remota
Configuração para desligamento automatizado de Computadores em um Ambiente Comercial
Compartilhamento de Rede com samba em modo Público/Anônimo de forma simples, rápido e fácil
Cups: Mapear/listar todas as impressoras de outro Servidor CUPS de forma rápida e fácil
Criando uma VPC na AWS via CLI
Tem como instalar o gerenciador AMD Adrenalin no Ubuntu 24.04? (7)