讓我們清楚我正在談論詞法分析工具。如何在flex中使用REJECT?
對於以下輸入:
aa bb cc dd
我需要的解析器來匹配以下子路線:
aa bb
bb cc
cc dd
我有這樣的正則表達式:
[a-zA-Z]+[ ]+[a-zA-Z]+
但這只是比賽:
aa bb
cc dd
有人告訴我拒絕命令可用於獲取輸出我需要但我不知道如何應用它。有人能幫我一把嗎?
讓我們清楚我正在談論詞法分析工具。如何在flex中使用REJECT?
對於以下輸入:
aa bb cc dd
我需要的解析器來匹配以下子路線:
aa bb
bb cc
cc dd
我有這樣的正則表達式:
[a-zA-Z]+[ ]+[a-zA-Z]+
但這只是比賽:
aa bb
cc dd
有人告訴我拒絕命令可用於獲取輸出我需要但我不知道如何應用它。有人能幫我一把嗎?
您可以使用正則表達式來枚舉整個集合中的n和n + 1對。
用「貪婪的」向後(或向前)匹配來查看分組。
這個問題通常不是關於(現代)正則表達式,而是詞法工具GNU-Flex,它的正則表達式確實是正常的(沒有分組和所有那些花哨的東西)。 –
這是一個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
但是,根據OP公佈的模式,'[a-zA-Z] + [] + [a-zA-Z] +',似乎'aa bb cc dd'是一個非常簡化的輸入示例。我知道Flex很少,但是我沒有看到'REJECT'被更普遍地使用。你是否也許? –
沒有,'REJECT'不會幫助你在這種情況下。如果匹配'[a-zA-Z] + [] + [a-zA-Z] +',你會想要讓詞法分析器內的char當前位置跳回2個位置,而'REJECT'會跳轉回到規則的開始,並嘗試匹配更多。雖然我不太熟悉Flex來回答你的問題。 –