对“yylex”的未定义引用

新手上路,请多包涵

我正在尝试使用 flex 和 bison 解析一个输入文件,但是在编译我的程序时遇到了一个困难。我附上了我得到的 flex 和 bison 代码和错误。

请帮我解决这些错误

词汇表

%{
 #include <iostream>
 #include <stdio.h>
#include "yacc.tab.h"
 #define YY_DECL extern "C" int yylex()

using namespace std;

%}

DOT             "."
COLON           ":"
SEMICOLON       ";"
COMMA           ","
ANGLE_LEFT      "<"
ANGLE_RIGHT     ">"
AT              "@"
EQUAL           "="
SQUARE_OPEN     "["
SQUARE_CLOSE    [^\\]"]"
OPENBRACE       "\("
CLOSEBRACE      "\)"
QUOTE           "\""
QUOTE_OPEN      "\""
QUOTE_CLOSE     [^\\]"\""
SPACE           " "
TAB             "\t"
CRLF            "\r\n"
QUOTED_PAIR     "\\"[^\r\n]
DIGIT           [0-9]
ALPHA           [a-zA-Z]
QTEXT           [0-9a-zA-Z!#$%&'()*+,\-.\/:;<=>?@\[\]^_`{|}~]

%%

[a-zA-Z0-9]+            { yylval.sval = strdup(yytext); return TOK_STRING; }

{SPACE}*                    {return TOK_SPACE; }

{SPACE}*Name.*              {return TOK_NAME; }
{SPACE}*SIZE.*              {return TOK_SIZE; }
{SPACE}*ITERATE.*           {return TOK_ITERATE; }
{SPACE}*DIRECTION.*     {return TOK_DIRECTION; }

^{CRLF}                         { return TOK_EMPTY_LINE; }
{CRLF}                          {}
.                               {}/* ignore unknown chars */

yacc.y

  %{
 #include <cstdio>
 #include <cstring>
 #include <iostream>
 #include <stdio.h>

using namespace std;

extern "C" int yylex();
extern "C" FILE *yyin;

void yyerror(const char* s);

%}

%union
{
    char* sval;
};

%token <sval> TOK_NAME
%token <sval> TOK_SIZE
%token <sval> TOK_STRING
%token <sval> TOK_ITERATE
%token <sval> TOK_DIRECTION

%token TOK_SPACE

%%

str:
    TOK_SPACE TOK_NAME TOK_SPACE TOK_STRING
    {
        cout << "Value:" << $2 << "->" << $4;
    }
    ;
%%

int main(void) {
    FILE * pt = fopen("new file ", "r" );
    if(!pt)
    {
    cout << "Bad Input.Noexistant file" << endl;
    return -1;
    }
    yyin = pt;
    do
    {
        yyparse();
     }while (!feof(yyin));
}
void yyerror(const char *s)
{
   cout << "Error. " << s << endl;
   exit(-1);
}

我使用以下方法构建这些:

 flex bas.l
bison -d yacc.y
g++ lex.yy.c yacc.tab.c -lfl -o scanner.exe

在编译程序时,我发现以下错误:

/tmp/cceIyDkD.o:在函数“main”中:

yacc.tab.c:(.text+0x708): ‘main’ 的多重定义

/tmp/ccatq95p.o:lex.yy.c:(.text+0x1228): 首先定义在这里

/usr/bin/ld:警告:符号“main”的大小从 /tmp/ccatq95p.o 中的 86 更改为 /tmp/cceIyDkD.o 中的 120

/tmp/cceIyDkD.o:在函数“yyparse()”中:

yacc.tab.c:(.text+0x2d6): undefined reference to `yylex’

collect2: ld 返回 1 个退出状态

请帮帮我

原文由 shailavi shah 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 822
1 个回答

我有一个类似的问题,原来 flex 2.6.x 改变了 yylex 的行为方式。我通过使用旧版本的 Flex 解决了这个问题。在 Ubuntu 中,有一个名为 flex-old 的包,即旧版本。用 flex-old 替换 flex 为我解决了这个问题。

原文由 Gustavo Oliveira 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题