2009-12-16 92 views
0

我需要能夠匹配某個字符串('[' then any number of equals signs or none then '['),然後我需要匹配一些其他匹配規則後匹配的右括號(']' then the same number of equals signs then ']')。 ((options{greedy=false;}:.)*如果你必須知道)。我不知道如何在ANTLR做到這一點,我該怎麼做?ANTLR解析問題

舉例:我需要匹配​​而不是[===[whatever arbitrary text ]==]

我需要爲任意數量的等號完成它,這樣就存在這個問題:我如何才能使它匹配相同數量的等號在開放的時候像關閉一樣?提供的解析器規則到目前爲止似乎沒有任何意義,只要幫助。

+0

我敢肯定,我的規則允許你想要什麼。 '技巧'在'等於'的遞歸定義中。 – Arne 2009-12-16 08:43:06

+0

仍然無法弄清楚最後一點點... – RCIX 2009-12-20 07:18:07

回答

2

不能easely寫一個詞法分析器,你需要解析的規則。兩條規則應該是足夠的。一個負責匹配大括號,一個匹配等號。

事情是這樣的:

braces : '[' ']' 
     | '[' equals ']' 
     ; 

equals : '=' equals '=' 
     | '=' braces '=' 
     ; 

這應包括您所描述的用例。不是絕對的舒爾,但也許你必須在'等於'的第一條規則中使用謂詞來避免模棱兩可的解釋。

編輯:

這是很難融入你貪婪的規則,同時避免(在ANTLR硬)詞法分析上下文切換或類似的東西。但是如果你願意在你的語法中集成一點java,你可以編寫一個詞法分析規則。

以下示例語法顯示瞭如何:

grammar TestLexer; 

SPECIAL : '[' { int counter = 0; } ('=' { counter++; })+ '[' (options{greedy=false;}:.)* ']' ('=' { counter--; })+ { if(counter != 0) throw new RecognitionException(input); } ']'; 

ID : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')* 
    ; 

WS : (' ' 
     | '\t' 
     | '\r' 
     | '\n' 
     ) {$channel=HIDDEN;} 
    ; 

rule : ID 
    | SPECIAL 
    ; 
+0

這是如何支持少於兩個等號的括號? – RCIX 2009-12-16 10:05:07

+0

請指出您的意見中未涵蓋哪些案例,然後我可以告訴您規則調用的順序。 例如[= [] =] => [equals](大括號規則2) => [=大括號=](等於規則2) => [= [] =](大括號規則1) – Arne 2009-12-16 10:21:47

+1

但是,我該如何插入'(options {greedy = false;}:。)*'在那裏?我明白現在的規則是如何運作的,但我並不瞭解如何適應。 – RCIX 2009-12-16 11:56:14

0

您的標籤提到lexing,但您的問題本身不。你想做的事情是非常規的,所以我不認爲這可以作爲lexing的一部分來完成(儘管我不記得ANTLR的詞法分析器是否嚴格定期 - 這是自我上一次以來的幾年使用ANTLR)。

但是,您所描述的內容在解析時應該是可行的。下面是語法的你所描述的:

thingy : LBRACKET middle RBRACKET; 
middle : EQUAL middle EQUAL 
     | LBRACKET RBRACKET;