2017-02-09 107 views
1

我爲Flex做了這個實驗,看看我是否輸入了ABC,如果它會看到所有的A,AB,ABC或者只有ABC或者只有表達式列表中的第一個匹配。Flex如何區分A,AB和ABC?

%{ 
#include <stdio.h> 
%} 

%% 
A puts("got A"); 
AB puts("got AB"); 
ABC puts("got ABC"); 
%% 

int main(int argc, char **argv) 
{ 
    yylex(); 

    return 0; 
} 

當我編譯和運行該程序後進入ABC,它以「得到了ABC」這語出驚人我,因爲我認爲法不守訪問文本的軌跡,只找到第一個匹配響應;但實際上,它似乎找到了最長的匹配。

當且僅當不再匹配時,Flex使用什麼策略來響應A?

回答

2

是(F)法使用maximal-munch原則應該幾乎是令人驚訝的,因爲它是有據可查的事實Flex manual

當產生的掃描儀運行時,必須分析其輸入要找的字符串,其匹配任何模式。如果找到多個匹配項,則會使用匹配最多文本的匹配項。如果找到兩個或更多相同長度的匹配,則首先在彈性輸入文件中列出的規則被選中。 (「如何輸入匹配」一節的第一段)

精確的算法是非常簡單的:每個令牌請求,柔性掃描文本,通過DFA移動時間。每次達到接受狀態時,它都會記錄當前的文本位置。當不再有可能的轉換時,它返回到最後記錄的接受位置,並且這成爲令牌的結尾。

結果是(F)lex可以多次掃描相同的文本,雖然它只對每個標記掃描一次。

一組需要過度回溯的詞法規則會減慢詞法掃描速度。這在Flex手冊部分Performance Considerations中討論,以及一些避免該問題的策略。但是,除病理情況外,背部追蹤的開銷不明顯。