2017-04-10 48 views
0

我正在學習編譯理論,以及如何使用flex,我有幾個問題。flex - no entry point

我在它創建了以下數據的文件法:

%% 
"hello"  printf("GOODBYE"); 
. ; 
%% 

這是我能想到的最簡單的一種。如果我理解正確,每次遇到hello標記時都會打印GOODBYE,並忽略其他所有內容。

我在這個lex文件上使用flex來生成一個C文件,現在我應該編譯該C代碼來獲取該語法的詞法分析器。

問題是生成的C代碼沒有入口點。它不會編譯。我的.lex文件不正確?我誤解了什麼嗎?

+0

你必須提供你自己的'main'功能 –

+0

你必須定義一個主函數。看一看[本教程](http://alumni.cs.ucr.edu/~lgao/teaching/flex.html) – LPs

+0

提供主函數的一種方法是鏈接到flex的運行時庫libfl。 (實際上,這是關於鏈接libfl的* only *原因。) –

回答

2

您需要在此文件中聲明自己的main(),在第二個%%之後或者將此.c與其他.c文件鏈接,其中main()聲明。

%% 
"hello"  printf("GOODBYE"); 
. ; 
%% 

int main() 
{ 
    yylex(); 
    return 0; 
} 
+0

啊,是的,我明白了。現在正在工作。非常感謝你,親切的先生。 –

1

的問題是,所生成的C代碼沒有入口點。它不會編譯。

不,它不是鏈接

我的.lex文件是不正確的?

我誤解的東西嗎?

是的。

「入口點」是鏈接器說功能main()的方式。 Flex僅爲詞法分析器功能生成代碼,因此如果您想要一個完整的程序,則需要單獨提供main。這是合適的,因爲大多數情況下,詞法分析器函數用於較大程序的上下文中,其中詞法分析器函數是Flex所需或唯一需要的。

如果您希望程序執行的任何操作都是用詞法分析規則描述的,那麼您需要一個重複調用詞法分析函數yylex()的主函數,直到它返回非零值。您可以編寫自己的代碼,但不需要執行 - flex帶有一個運行時庫libfl,其主要用途是提供完全這樣的main。你只需要鏈接它,可能在你編譯/鏈接命令的末尾添加-lfl