C “main'”的多重定义;bison输出文件编译时

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-

所以我正在编写一个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-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++) };