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);
}