2011-09-20 63 views
1

讓我們清楚我正在談論詞法分析工具。如何在flex中使用REJECT?

對於以下輸入:

aa bb cc dd

我需要的解析器來匹配以下子路線:

aa bb

bb cc

cc dd

我有這樣的正則表達式:

[a-zA-Z]+[ ]+[a-zA-Z]+

但這只是比賽:

aa bb

cc dd

有人告訴我拒絕命令可用於獲取輸出我需要但我不知道如何應用它。有人能幫我一把嗎?

+1

沒有,'REJECT'不會幫助你在這種情況下。如果匹配'[a-zA-Z] + [] + [a-zA-Z] +',你會想要讓詞法分析器內的char當前位置跳回2個位置,而'REJECT'會跳轉回到規則的開始,並嘗試匹配更多。雖然我不太熟悉Flex來回答你的問題。 –

回答

-1

您可以使用正則表達式來枚舉整個集合中的n和n + 1對。

用「貪婪的」向後(或向前)匹配來查看分組。

+2

這個問題通常不是關於(現代)正則表達式,而是詞法工具GNU-Flex,它的正則表達式確實是正常的(沒有分組和所有那些花哨的東西)。 –

-1

這是一個Flex的解決問題的辦法:

 
    %% 
    "aa bb"   {printf("matched aa bb\n");REJECT;} 
    "bb cc"   {printf("matched bb cc\n");REJECT;} 
    "cc dd"   {printf("matched cc dd\n");REJECT;} 
    .    /*ignore anything else*/ 
    %% 
    int main() 
    { 
    yylex(); 
    return 0; 
    } 


When I run the code on your input I get : 
matched aa bb 
matched bb cc 
matched cc dd 
+1

但是,根據OP公佈的模式,'[a-zA-Z] + [] + [a-zA-Z] +',似乎'aa bb cc dd'是一個非常簡化的輸入示例。我知道Flex很少,但是我沒有看到'REJECT'被更普遍地使用。你是否也許? –