对“yylex”的未定义引用

sha*_*hah 3 c c++ bison flex-lexer

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

请帮我解决这些错误

lex.l

%{
 #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 */  
Run Code Online (Sandbox Code Playgroud)

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);     
}  
Run Code Online (Sandbox Code Playgroud)

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

flex bas.l 
bison -d yacc.y 
g++ lex.yy.c yacc.tab.c -lfl -o scanner.exe 
Run Code Online (Sandbox Code Playgroud)

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

/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: 在函数中()':
yacc.tab.c:(.text+0x2d6): 未定义对 `yylex'
collect2 的引用:ld 返回 1 个退出状态

请帮帮我

小智 6

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

  • 最好包含 2.6.x 中更改内容的描述,或者至少为那些宁愿修复代码以使用新版本的 flex 的人提供一个链接。 (3认同)