Mini Analisador Léxico que conta palavras numa string

Publicado por Samuel Leonardo (última atualização em 23/04/2021)

[ Hits: 357 ]

Homepage: https://nerdki.blogspot.com/

Download minilexer.c




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

  



Esconder código-fonte

/**
 * @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;
}

Scripts recomendados

Calculo de IMC escrito em linguagem C

Número de grãos de trigo

Interpolação linear

Verificação do número de CPF

Formatar strings em C (RG, telefone, CEP etc)


  

Comentários
[1] Comentário enviado por mauricio123 em 24/04/2021 - 11:44h


Boa iniciativa. Isso pode ser adaptado e melhorado para usá-lo como um comando da sistema. Vou estudar seu código um dia desses.

___________________________________________________________
[code]Conhecimento não se Leva para o Túmulo.
https://github.com/MauricioFerrari-NovaTrento [/code]

[2] Comentário enviado por SamL em 24/04/2021 - 23:33h


[1] Comentário enviado por mauricio123 em 24/04/2021 - 11:44h
Boa iniciativa. Isso pode ser adaptado e melhorado para usá-lo como um comando da sistema. Vou estudar seu código um dia desses.

Mas tome cuidado, use apenas como curiosidade. Não aplique isso em coisas críticas, porque o programa conta palavras MAS somente que tenha caracteres ASCII. Se por exemplo tiver palavras com acento, pode ser que o comportamento fique inesperado ou bugado. Sai melhor usar programas como o wc e afins.
Use meu código apenas pra brincar com ele, como aprendizado.


[3] Comentário enviado por mauricio123 em 30/04/2021 - 22:02h


ok, entendi.

___________________________________________________________
[code]Conhecimento não se Leva para o Túmulo.
https://github.com/MauricioFerrari-NovaTrento [/code]


Contribuir com comentário