0

我正在尝试编译一个 .l 文件来创建一个词法分析器。代码是:

%{
#include "ifanw.tab.h"
extern int yylval;
%}
%%
"="      { return EQ; }
"!="     { return NE; }
"<"      { return LT; }
"<="     { return LE; }
">"      { return GT; }
">="     { return GE; }
"+"      { return PLUS; }
"-"      { return MINUS; }
"*"      { return MULT; }
"/"      { return DIVIDE; }
")"      { return RPAREN; }
"("      { return LPAREN; }
":="     { return ASSIGN; }
";"      { return SEMICOLON; }
"IF"     { return IF; }
"THEN"   { return THEN; }
"ELSE"   { return ELSE; }
"FI"     { return FI; }
"WHILE"  { return WHILE; }
"DO"     { return DO; }
"OD"     { return OD; }
"PRINT"  { return PRINT; }
[0-9]+   { yylval = atoi(yytext); return NUMBER; }
[a-z]    { yylval = yytext[0] - 'a'; return NAME; }   
\        { ; }
\n       { nextline(); }
\t       { ; }
"//".*\n { nextline(); }
.        { yyerror("illegal token"); }
%%

我输入的命令是:

flex filename.l 

gcc -c lex.yy.c -o out

输出是

filename.l:2:23: fatal error: ifanw.tab.h: no such file or directory.

是 gcc 库中的问题吗?如果是这样,我在哪里可以下载更新/修复的库?否则,有什么问题?

4

2 回答 2

0

将 flex 库添加到您的 gcc 命令中:

gcc -c lex.yy.c -lfl -o out

另外,如果你包含一个tab.h文件,你有野牛文件吗?如果是这样,你是用bison命令编译它吗?

名称是 bison 生成的标头,因此您应该有一个.y扩展名为的文件,您需要使用 bison 命令编译该文件:bison *.y

使用 编译后bison,再次执行你的命令,但记得添加 flex 库标志 ( -lfl)。

于 2013-02-03T14:40:09.483 回答
0

gcc告诉你问题是什么:它找不到你指定的包含文件。

这不是图书馆的问题。

您需要先从 .y 文件创建该文件

bison --debug --verbose -d ifanw.y

您可能会发现这个小教程很有用。

如果您没有 .y 文件,那么您正在尝试编译一个不完整的包,这将无法正常工作。您必须以某种方式从您获得已有文件的地方获取丢失的文件。

于 2013-02-03T14:57:20.063 回答