C “main'”的多重定义;bison输出文件编译时
所以我正在编写一个bison(没有lex)解析器,现在我想从文件中读取输入代码,并将输出写入另一个文件 搜索stackoverflow一段时间后,我发现这种方法应该很好。 野牛: 这里是cc编译的结果:C “main'”的多重定义;bison输出文件编译时,c,parsing,bison,C,Parsing,Bison,所以我正在编写一个bison(没有lex)解析器,现在我想从文件中读取输入代码,并将输出写入另一个文件 搜索stackoverflow一段时间后,我发现这种方法应该很好。 野牛: 这里是cc编译的结果: /tmp/ccNqiuhW.o: In function `main': bison.tab.c:(.text+0x960): multiple definition of `main' /usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-
/tmp/ccNqiuhW.o: In function `main':
bison.tab.c:(.text+0x960): multiple definition of `main'
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/liby.a(main.o):(.text.startup+0x0): first defined here
/tmp/ccNqiuhW.o: In function `main':
bison.tab.c:(.text+0x98c): undefined reference to `yyin'
collect2: error: ld returned 1 exit status
输出bison.tab.c文件只有一个main。Ofc int/void main不重要。你能教我怎么正确地做吗
顺便说一句,我不想发不同的帖子,这里有一个小问题。如何将字符串(char*)存储在bison中的$$中?例如,我想在遇到int语法后生成一个代码字符串。我有这个错误,无法找到答案:
bison.y:94:8: warning: assignment makes integer from pointer without a cast [-Wint-conversion]
INTNUM: NUMBER | DIGIT INTNUM {$$ = "string"};
bison.y: In function ‘yyparse’:
bison.y:28:15: warning: format ‘%s’ expects argument of type ‘char *’, but argument 3 has type ‘int’ [-Wformat=]
PROGRAM: EXPRS { fprintf(f2, "%s: string here %d.\n", $$, counter++) };
如果我找到帮助,那将非常好。您正在链接库
liby
(链接器选项-ly
)。有这样的说法:
Yacc库包含yyerror
和
主要功能
这就是为什么有多个main
定义的原因。你提供了一个,liby有一个
此外,文件继续说
这些默认实现通常不有用,但POSIX需要它们
(增加重点)
构建包含bison生成的解析器的程序不需要链接liby,通常不应该这样做。相反,请提供您自己的main()
和您自己的yyerror()
,这两项您都已经完成了
此外,无论您是否链接liby,您都需要在
中提供yy的定义,而不仅仅是声明。为此,请从语法文件中的yyin
声明中删除extern
关键字
您的语法不完整(根本没有规则),而且%name
指令没有文档记录,我的野牛也无法识别,但是如果我添加一条伪规则并注释掉%name
,以及讨论的其他更改,然后,bison
为我生成一个C源文件,该文件可以成功编译为可执行文件(没有liby)。您正在链接库liby
(链接器选项-ly
)。有这样的说法:
Yacc库包含yyerror
和
主要功能
这就是为什么有多个main
定义的原因。你提供了一个,liby有一个
此外,文件继续说
这些默认实现通常不有用,但POSIX需要它们
(增加重点)
构建包含bison生成的解析器的程序不需要链接liby,通常不应该这样做。相反,请提供您自己的main()
和您自己的yyerror()
,这两项您都已经完成了
此外,无论您是否链接liby,您都需要在
中提供yy的定义,而不仅仅是声明。为此,请从语法文件中的yyin
声明中删除extern
关键字
您的语法不完整(根本没有规则),而且%name
指令没有文档记录,我的野牛也无法识别,但是如果我添加一条伪规则并注释掉%name
,以及讨论的其他更改,然后,bison
为我生成一个可以成功编译为可执行文件(无liby)的C源文件。使用-l
选项添加库的顺序是相关的。将-ly
选项移到源文件后面的最后一个位置,这样就可以像cc bison.tab.c-ly
一样构建。因此,库liby
包含一个默认的main,在用户未提供main时使用。这意味着必须首先找到main,以便不会从库中提取main。使用-l
选项添加库的顺序是相关的。将-ly
选项移到源文件后面的最后一个位置,这样就可以像cc bison.tab.c-ly
一样构建。因此,库liby
包含一个默认的main,在用户未提供main时使用。这意味着必须首先找到main,这样就不会从库中提取main。而且,如果确实链接库,请在命令行中将库放在对象(或源)文件之后(这通常是使用库时应该做的):cc bison.tab.c-ly
-这也会解决问题。如果确实链接库,将库放在命令行中的对象(或源)文件之后(这通常是使用库时应该做的):cc bison.tab.c-ly
-这也可以解决问题。
/tmp/ccNqiuhW.o: In function `main':
bison.tab.c:(.text+0x960): multiple definition of `main'
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/liby.a(main.o):(.text.startup+0x0): first defined here
/tmp/ccNqiuhW.o: In function `main':
bison.tab.c:(.text+0x98c): undefined reference to `yyin'
collect2: error: ld returned 1 exit status
bison.y:94:8: warning: assignment makes integer from pointer without a cast [-Wint-conversion]
INTNUM: NUMBER | DIGIT INTNUM {$$ = "string"};
bison.y: In function ‘yyparse’:
bison.y:28:15: warning: format ‘%s’ expects argument of type ‘char *’, but argument 3 has type ‘int’ [-Wformat=]
PROGRAM: EXPRS { fprintf(f2, "%s: string here %d.\n", $$, counter++) };