gpt4 book ai didi

c++ - undefined reference yyparse C++

转载 作者:行者123 更新时间:2023-11-30 03:45:06 24 4
gpt4 key购买 nike

我正在使用 bison 和 flex 开发一个简单的解释器。当我编译我的代码时,我收到“未定义对‘yyparse’的引用”的错误。

mylang.ll

%{

/******************** C-libraries and Token definitions *****************/

#include <string.h> /* for strdup */
#include "mylang.yy.tab.h" /* for token definitions and yylval */
extern int yyparse(void);

%}

%option nounput yylineno


/******************** MY TOKEN Definitions *****************/


%%

int yywrap(void){}

mylang.yy

%{

/******************** C Libraries, Symbol Table, Code Generator & other C code *****************/
#include <stdio.h> /* For I/O */
#include <stdlib.h> /* For malloc here and in symbol table */
#include <string.h> /* For strcmp in symbol table */

#include "StackMachine.h" /* Stack Machine*/

#include "CodeGenerator.h" /* Code Generator*/

#include "SymbolTable.h" /* Symbol Table*/

extern "C" int yylex(void);

extern "C" void yyerror(const char *);
extern "C" int yylineno;

#include "IM.h" /* Identifier Making */

#define YYDEBUG 1 /* For Debugging*/

%}

/******************** SEMANTIC RECORDS *****************/

%union semrec /* The Semantic Records*/
{
double floatnum; /* Double values */
char *string; /* Identifiers*/
}

/******************** TOKENS ***************************/

%%
/******************** GRAMMAR RULES for the Simple language *******/

%%

/******************** YYERROR ********************************************************** */

void yyerror (const char *s ) /* Called by yyparse on error */
{
errors++;
printf ("Line Number : %d .. %s\n", yylineno,s);
}

mylang.cpp

#include "Headers.h"
extern "C" {
int yyparse(void);
}
/* ********************************** MAIN *****************************/
int main( int argc, char *argv[] )
{
extern FILE *yyin;
++argv; --argc;
yyin = fopen( argv[0], "r" );

errors = 0;
yyparse ();

/* Execute Code */

return 0;
}

我的 makefile 运行如下。

g++ -Os -g -std=c++0x -c SM.cpp
g++ -Os -g -std=c++0x -c mylang.cpp
bison -d mylang.yy
flex mylang.ll
g++ -Os -g -std=c++0x -c mylang.yy.tab.c
gcc -c lex.yy.c
g++ -Os -std=c++0x -o mylang mylang.yy.tab.o lex.yy.o SM.o mylang.o -lm

当我运行这段代码时,出现以下编译时错误。

mylang.cpp:31: undefined reference to `yyparse'

collect2: error: ld returned 1 exit status

make: *** [mylang] Error 1

我在哪里定义 yyparse 函数?我在代码中犯了什么错误?

最佳答案

你正在用 C++ 编译器编译你的解析器

g++ -Os -g -std=c++0x -c mylang.yy.tab.c

但是您将从该文件导出的解析器函数声明为 extern“C”,从而导致链接器查找符合 C 命名约定的符号 yyparse。

链接器搜索符号 _yyparse,而 C++ 编译器已使用 C++ 名称修改导出符号(将类型信息添加到名称中,以便可以导出函数的所有可能重载)并将其转换为类似 _Z3yyparsev 的内容。

删除 mylang.cpp 中 yyparse 声明周围的 extern "C"应该可以解决问题。

关于c++ - undefined reference yyparse C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35053838/

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