2013-02-03 28 views
0

我想编译一个.l文件来创建一个词法分析器。代码:创建词法分析器时缺少.h文件

%{ 
#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库的问题?如果是这样,我可以在哪里下载更新/固定的库? 否则,有什么问题?

+0

未来;一定要小心标签。 Flex用于Adobe/Apache UI框架。 Lex和/或gnu-flex用于词法分析器。 – JeffryHouser

回答

0

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

这不是图书馆的问题。

您需要从.Y文件第一

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

您可能会发现this small tutorial有用创建该文件。

如果您没有.y文件,那么您正在尝试编译一个不完整的软件包,而这样做不起作用。你将不得不以某种方式从你已有的文件中获取丢失的文件。

+0

这不是我的投票。 –

+0

哦,那就好了。看看这个教程,它会告诉你一个.y文件应该是什么样子。如果你是初学者,我建议你首先阅读关于一般语法的一些理论,特别是lex/yacc。否则,如果你想解析解析器的另一个问题,也许你会问问题本身的建议。有人可能会提出最实用的语法方法。 – LSerni

+0

除了-d之外的所有野牛选项都是多余的imho。 – fuz

0

Flex库添加到您的GCC命令:

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

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

通过,这是一个野牛生成的头,所以你应该与.y扩展,您需要与野牛命令编译文件的名称:bison *.y

而且随着bison编译后,再次执行你的命令,但要记住添加flex库标志(-lfl)。

+0

此命令具有相同的输出。我尝试命令gcc -lfl和输出是'usr/lib/i386-linux-gnu/libfl_pic.a(libfl_pic_a-libmain.o):在main函数中: /build/buildd/flex-2.5.35/libmain.c:30:未定义的引用'yylex' collect2:ld返回1退出状态 ' –

+0

你有一个名为'ifanw.tab.h'的文件吗? –

+0

这是一个野牛生成头文件的名称,所以你应该有一个带'.yy'或'.y'扩展名的文件,你需要用'bison'命令编译:'bison * .yy * .y' –