gpt4 book ai didi

c++ - 使用 g++、bison 和 flex 进行编译时,yyparse() 中未定义对 `yylex' 的引用

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:11:40 26 4
gpt4 key购买 nike

我在编译代码时遇到问题(未定义对“yylex”的引用)。让我们从代码片段开始,我将在下面描述详细信息:

弹性:

%{
#include <stdlib.h>
extern int yylex();
%}
%%
"=" {return EQ;}
"!=" {return NE;}
"<" {return LT;}
">" {return GT;}
":=" {return ASSIGN;}
";" {return SEMICOLON;}
"IF" {return IF;}
"THEN"{return THEN;}

"END" {return END;}
[_a-z]+ {yylval.text = strdup(yytext); return IDENTIFIER;}
[ \t]+
[0-9]+ {
yylval.var = atoi (yytext);
return NUMBER;
}
[-+/^*'%'()] {
return *yytext;
}
\n return RESULT;
%%

Bison :

%{
extern "C"
{
int yyparse();
int yylex(void);
void yyerror(char *s){}
int yywrap(void){return 1;}
}

#include <iostream>
#include <vector>
#include <string>
#include <stdlib.h>
#include <map>

using namespace std;

vector <string> instructions;
map <> vars;
%}

%union{
char* text;
int var;
}


%token EQ
%token NE
%token ASSIGN
%token SEMICOLON
%token IF
%token THEN
%token <text> IDENTIFIER
%token <var> NUMBER
%token <var> RESULT

%left '+' '-'
%left '*' '/' '%'
%right '^'

%%

exp: NUMBER
| IDENTIFIER
| IDENTIFIER "+" IDENTIFIER
| IDENTIFIER "-" IDENTIFIER
;
%%

int main(void){
yyparse();
}

这是我用来编译和运行程序的 bash 脚本:

#!/bin/bash
clear
rm launcher lex.yy.cpp *.tab.cpp *.tab.hpp
bison -d -o list.tab.cpp *.y
flex -o lex.yy.cpp *.l
g++ -o launcher *.cpp -lfl

为了清楚起见,我只在此处发布代码的最重要部分,因为其余部分在这里并不是必需的。无论如何,如果有人想查看完整代码,请将其发布在这里:http://pastebin.com/1rS2FBJj .这是一个更大的代码块,但占据了更多的位置。

当我尝试将所有文​​件编译为 *.c 文件然后使用 gcc 时,一切正常。但是,当我尝试将编译器切换到 g++ 并因此将文件切换到 cpp 时,我不断收到此错误:

list.tab.cpp: In function ‘int yyparse()’:list.tab.cpp:1397: warning: deprecated conversion from string constant to ‘char*’list.tab.cpp:1540: warning: deprecated conversion from string constant to ‘char*’/tmp/ccdqpQVx.o: In function `yyparse':list.tab.cpp:(.text+0x252): undefined reference to `yylex'collect2: ld returned 1 exit status

谁能给我一个提示,最好的方法是什么?

最佳答案

在您的 Flex 文件中,您声明:

extern int yylex();

当编译为 C++ 时,它声明了一个具有 C++ 链接 的函数。在您的 Bison 文件中,您声明:

extern "C" {
int yylex();
}

这给了它 C 链接。它们是两个不同的函数。您定义 C++ 版本(或者更确切地说,Flex 为您定义它)​​,但是您声明 C 版本,而 C 版本是编译器认为您尝试的版本调用(在 Bison 生成的代码中)。链接器发现使用了 C 版本,但找不到定义。

选择一个链接并始终如一地使用它。 (我会选择 C++,因为它允许完全省略代码中的“外部”内容。)

关于c++ - 使用 g++、bison 和 flex 进行编译时,yyparse() 中未定义对 `yylex' 的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6431942/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com