Exemplo 1

Para baixar o executável clique aqui.

/* Exemplo da maquina de estado PLN */

#include "stdio.h"
#include "string.h"
#include "dos.h"

#define MAX 100
#define NOUN 1
#define VERB 2
#define ADJ 3
#define ADV 4
#define DET 5
#define PREP 6
#define TERM 7
#define STARTUP -1

/* estrutura do banco de dados das palavras (wdb) */

struct word {
char word[20];
char type;
};

struct word wdb[MAX]; /* matriz da estrutura do db */
int db_pos=0; /* numero de entradas no wdb */

char state=STARTUP; /* contem o estado de maquina atual */
char s[80]; /* contem a sentenca */
char *t_pos=0; /* ponteiro para sentenca */
char token[80]; /* contem a palavra */

/* coloca os fatos no banco de dados */

void assert_wdb(char word[20],char type){

if (db_pos<MAX) {
strcpy(wdb[db_pos].word, word);
wdb[db_pos].type=type;
db_pos++;
}
else printf ("O banco de dados esta cheio. \n");
}

void setup ( )
{
assert_wdb ("door", NOUN);
assert_wdb ("window", NOUN);
assert_wdb ("house", NOUN);
assert_wdb ("child", NOUN);
assert_wdb ("has", VERB);
assert_wdb ("runs", VERB);
assert_wdb ("plays", VERB);
assert_wdb ("large", ADJ);
assert_wdb ("quickly", ADV);
assert_wdb ("the", DET);
assert_wdb ("a", DET);
assert_wdb ("to", PREP);
assert_wdb (".", TERM);
}

/* acha o tipo dando a palavra */
find_type (char word[20]){

int t;
for (t=0; t<db_pos; t++)
if (!strcmp (word, wdb[t].word))
return wdb[t].type;
return 0;
}

/* verificacao para a validade da transcricao de estado */

is_legal (char word[20],char state){

int type;
type=find_type(word);
if (type==DET) return state; /*pula*/
if (type==TERM) return TERM; /* fim da sentenca */

switch(state) {
case STARTUP: if (type!=DET) return type;
else return STARTUP;
case NOUN:
if (type == VERB) return VERB;
if (type == PREP) return PREP;
break;
case VERB:
if (type == PREP) return PREP;
if (type == NOUN) return NOUN;
if (type == ADV) return ADV;
if (type == ADJ) return ADJ;
break;
case ADV:
if (type == NOUN) return NOUN;
if (type == PREP) return PREP;
break;
case ADJ:
if (type == NOUN) return NOUN;
break;
case PREP:
if (type == ADJ) return ADJ;
if (type == NOUN) return NOUN;
break;
}
return 0;
}

/* retorna da sentenca de entrada um "token" */

void get_token ( )
{
char *p;
p=token;
/* pula espacos */
while(*t_pos==' ') t_pos++;
if (*t_pos == '.') {
*p++='.';
*p='\0';
return;}
/* le uma palavra ate um espaco ou ponto */
while (*t_pos!= ' ' && *t_pos!='.') {
*p=*t_pos++;
p++;
}
*p='\0';
}

/* analisador da maquina de estado */

parse ( )
{
char type;
do {
get_token ();
/* transcricao para novo estado */
if (!(state=is_legal(token,state))) {
printf ("Erro na sentenca. \n");
return 0;
}
} while (*token!='.');
return 1;
}

void main ( )
{
setup ( );

printf ("Entre com a sentenca:");
gets(s);
t_pos=s;
if(parse()) printf ("Sentenca OK\n");
delay(10000);
}

VOLTAR