Mini Analisador Léxico que conta palavras numa string
Publicado por Samuel Leonardo (última atualização em 23/04/2021)
[ Hits: 1.914 ]
Homepage: https://nerdki.blogspot.com/
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)
Automato Finito Determinístico
função de remoção em uma Arvore
Bom treino, muito completo: classificação de atletas
Atenção a quem posta conteúdo de dicas, scripts e tal (2)
Manutenção de sistemas Linux Debian e derivados com apt-get, apt, aptitude e dpkg
Melhorando o tempo de boot do Fedora e outras distribuições
Como instalar as extensões Dash To Dock e Hide Top Bar no Gnome 45/46
Como Atualizar Fedora 39 para 40
Instalar Google Chrome no Debian e derivados
Consertando o erro do Sushi e Wayland no Opensuse Leap 15
Instalar a última versão do PostgreSQL no Lunix mantendo atualizado
Flathub na sua distribuição Linux e comandos básicos de gerenciamento
ASRock H310CM-HG4 vs Linux [RESOLVIDO] (20)
redirecionando saida de comando touch para o AWK[AJUDA] (8)
Manipulação de dados binários, aplicações (0)
Fedora 40 Melhor que Ubuntu 24.04 (7)
Microfone do meu headset não é recinhecido. Meu notebook é um Acer Asp... (13)