从lex和yacc语法生成编译器

11

我正在尝试生成一个编译器,以便可以将.c文件传递给它。

我从http://www.quut.com/c/ANSI-C-grammar-y.html下载了YACC和LEX语法,并将它们命名为clexyacc.l和clexyacc.y。

在终端上生成时我执行了以下命令:

yacc -d clexyacc.y
lex clexyacc.l

一切都进行得很顺利。当我进行最后一步时,出现了一些错误。

最后一步是:cc lex.yy.c y.tab.c -oclexyacc.exe

但我遇到了以下错误:

y.tab.c:2261:16: warning: implicit declaration of function 'yylex' is invalid in
      C99 [-Wimplicit-function-declaration]
      yychar = YYLEX;
               ^
y.tab.c:1617:16: note: expanded from macro 'YYLEX'
# define YYLEX yylex ()
               ^
y.tab.c:2379:7: warning: implicit declaration of function 'yyerror' is invalid
      in C99 [-Wimplicit-function-declaration]
      yyerror (YY_("syntax error"));
      ^
clexyacc.y:530:6: error: conflicting types for 'yyerror'
void yyerror(const char *s)
     ^
y.tab.c:2379:7: note: previous implicit declaration is here
      yyerror (YY_("syntax error"));
      ^
2 warnings and 1 error generated.

你如何在词法分析器文件中定义 yyerror?请参见:https://dev59.com/ynDXa4cB1Zd3GeqP9Ce9 - Joe
在我的 clex.l 文件中,我只有两个对 yyerror 的引用,它们是: extern void yyerror(const char *); yyerror("未终止的注释"); - ChasingCars
1个回答

21

你使用的yacc版本产生了对C99无效的C代码。

它生成的代码在调用yylex或yyerror函数之前没有包含声明。这会产生警告。在yyerror的情况下,这还会导致一个不匹配后续实际定义的隐式声明。

你可以通过在.y文件顶部包括以下内容来解决这个问题:

%{
int yylex();
void yyerror(const char *s);
%}

或者,您可以切换到更现代的yacc编译器。

另请参阅: 简单的yacc语法产生错误


我应该将它们添加到我的yacc文件顶部,对吗? - ChasingCars
1
我已在我的yacc文件顶部添加了以下内容:"%{ int yylex(); void yyerror(const char *s); %}"编译最后一部分时,我现在收到以下错误:"Undefined symbols for architecture x86_64: "_main", referenced from: implicit entry/start for main executable ld: symbol(s) not found for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation)" - ChasingCars
你正在尝试将其编译为可执行文件,但程序中没有主函数。仅有解析器/词法分析器是无法完成任何操作的,你需要编写一个主函数来传递一个文件并对解析结果进行处理。或者只编译成目标文件而不链接,并在稍后将其链接到包含主函数的对象上(使用-c选项)。 - harmic
哦,好的。那你是告诉我应该只专注于这部分:“yacc -d clexyacc.y lex clexyacc.l”,然后将其编译成一个 .c 文件? - ChasingCars
好的。非常感谢,我已经做到了,并生成了两个.o文件(lex.yy.o和y.tab.o)。现在只有一个最后的问题,因为我现在对所有这些都有点新手。我如何使用所有这些来解析.c文件? - ChasingCars
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接