У меня есть следующий пример lex basi c:
%{
/* INCLUDE FILES */
#include <stdlib.h>
/* STATES */
enum {
LOOKUP = 0,
VERB,
ADJ,
ADV,
NOUN,
PREP,
PRON,
CONJ
};
int state;
/* FUNCTION DECLARATION */
int add_word(int type, char *word);
int lookup_word(char *word);
%}
%%
/* RESET TO LOOKUP ON NEW LINE CHARACTER */
\n { state = LOOKUP; }
/* DEFINE STATES WHEN KEYWORD FOUND AS THE FIRST WORD */
^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: adjective\n", yytext); break;
case ADV: printf("%s: adverb\n", yytext); break;
case NOUN: printf("%s: noun\n", yytext); break;
case PREP: printf("%s: preposition\n", yytext); break;
case PRON: printf("%s: pronoun\n", yytext); break;
case CONJ: printf("%s: conjunction\n", yytext); break;
default:
printf("%s: don't recognize\n", yytext);
break;
}
}
}
. /* IGNORE ANYTHING ELSE */
%%
int main() {
yylex();
}
/* LINKED LIST TO STORE WORDS */
struct word {
char *word_name;
int word_type;
struct word *next;
};
struct word *word_list;
/* ADD WORD METHOD: ADDS A WORD TO SYMBOL TABLE */
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;
}
/* LOOKUP WORD METHOD: RETRIEVES A WORD FROM SYMBOL TABLE */
int lookup_word(char *word) {
struct word *wp = word_list;
/* SEARCH DOWN THE LIST */
for(; wp!=NULL; wp = wp->next) {
if(strcmp(wp->word_name, word) == 0)
return wp->word_type;
}
return LOOKUP; /* NOT FOUND */
}
Когда я пытаюсь его скомпилировать, я получаю:
% lex ch1-04.l
% cc -o ch1-04 -ll lex.yy.c
ld: error: duplicate symbol: main
>>> defined at libmain.c:29 (/usr/src/contrib/flex/libmain.c:29)
>>> libmain.o:(main) in archive /usr/lib/libl.a
>>> defined at lex.yy.c
>>> /tmp/lex-d06804.o:(.text+0x24E0)
cc: error: linker command failed with exit code 1 (use -v to see invocation)
Я использую FreeBSD 12.1