2013-02-03 25 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' –