Почему я получаю повторяющийся символ: main при попытке скомпилировать пример lex? - PullRequest
1 голос
/ 10 июля 2020

У меня есть следующий пример 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...