Parsing 莱克斯;多定义错误

Parsing 莱克斯;多定义错误,parsing,compiler-construction,yacc,lex,Parsing,Compiler Construction,Yacc,Lex,我想做代码扫描器和解析器,但我不知道为什么仅仅通过查看错误日志就会发生这个错误。扫描器获取示例代码并将其划分为标记,然后返回代码中每个标记正在执行的操作。解析器接收扫描器返回的值并根据规则解析代码。 它检查示例代码语法的有效性 最后这是我的错误 lex.yy.o: In function main: lex.yy.c:(.text+0x1d2a): multiple definition of main y.tab.o:y.tab.c:(.text+0x861): first defined h

我想做代码扫描器和解析器,但我不知道为什么仅仅通过查看错误日志就会发生这个错误。扫描器获取示例代码并将其划分为标记,然后返回代码中每个标记正在执行的操作。解析器接收扫描器返回的值并根据规则解析代码。 它检查示例代码语法的有效性

最后这是我的错误

lex.yy.o: In function main:
lex.yy.c:(.text+0x1d2a): multiple definition of main
y.tab.o:y.tab.c:(.text+0x861): first defined here
collect2: error: ld returned 1 exit status

您在两个文件中都定义了
main
,但C只允许在程序中定义一个
main
,这就是链接器错误告诉您的

scanner文件中的
main
有一个无效的原型(近20年来,C不允许没有返回类型的函数定义),并且只调用一次
yylex
,这不会有多大作用。所以这似乎毫无意义。如果您想在不使用解析器的情况下调试扫描仪,您可以使用
-lfl
链接扫描仪;该库包含
main
的定义,该定义重复调用
yylex
,直到文件结束

您可以在生成扫描仪时使用
--debug
标志构建扫描仪的调试版本,而不是通过扫描仪分散
printf
调用。这将打印出所有扫描仪操作的跟踪