Skip to content

Instantly share code, notes, and snippets.

@bitristan
Created December 12, 2022 03:40
Show Gist options
  • Save bitristan/82fb202733d52009cd87d38090d5502b to your computer and use it in GitHub Desktop.
Save bitristan/82fb202733d52009cd87d38090d5502b to your computer and use it in GitHub Desktop.
带符号表的单词识别程序 flex
%{
/*
* 带符号表的单词识别程序
*/
enum {
LOOKUP = 0, /* 默认查找 */
VERB,
ADJ,
ADV,
NOUN,
PREP,
PRON,
CONJ
};
int state;
int add_word(int type, char *word);
int lookup_word(char * word);
%}
%%
\n { state = LOOKUP; } /* 行结束,返回到默认状态 */
^verb { state = VERB; }
^adj { state = ADJ; }
^adv { state = ADV; }
^noun { state = NOUN; }
^prep { state = PREP; }
^pron { state = PRON; }
^conj { state = CONJ; }
[a-zA-Z]+ {
if (state != LOOKUP) {
add_word(state, yytext);
} else {
switch(lookup_word(yytext)) {
case VERB: printf("%s: verb\n", yytext); break;
case ADJ: printf("%s: adj\n", yytext); break;
case ADV: printf("%s: adv\n", yytext); break;
case NOUN: printf("%s: noun\n", yytext); break;
case PREP: printf("%s: prep\n", yytext); break;
case PRON: printf("%s: pron\n", yytext); break;
case CONJ: printf("%s: conj\n", yytext); break;
default:
printf("%s: don't recognize\n", yytext);
break;
}
}
}
%%
int main() {
yylex();
return 1;
}
struct word {
char *word_name;
int word_type;
struct word *next;
};
struct word *word_list;
extern void *malloc();
int add_word(int type, char *word) {
struct word *wp;
if (lookup_word(word) != LOOKUP) {
printf("!!!warning: word %s is already defined\n", word);
return 0;
}
wp = (struct word *)malloc(sizeof(struct word));
wp->next = word_list;
wp->word_name = (char *)malloc(strlen(word) + 1);
strcpy(wp->word_name, word);
wp->word_type = type;
word_list = wp;
return 1;
}
int lookup_word(char *word) {
struct word *wp = word_list;
for (; wp; wp = wp->next) {
if (strcmp(wp->word_name, word) == 0) {
return wp->word_type;
}
}
return LOOKUP;
}
@bitristan
Copy link
Author

flex word_recognizer.l
gcc -o recognizer lex.yy.c -ll

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment