2009-05-18 77 views
0

我試圖解析的Name=Value對,其中的值可以包含除空白任何東西(即值可以包含等號)的列表。
名稱僅限於通常的標識符字符。ANTLR相當於野牛拒絕行動?

的問題是,「價值」令牌匹配的一切。例如,對於輸入:

dude=sweet 

解析器將所述整個輸入與「值」令牌(和拋出MismatchedTokenException)相匹配。

bison,是否有可能爲令牌分配狀態(或者僅僅是爲非終止?),以便它們只有在明確過渡到該狀態後才成爲「符合條件」匹配。

編輯關於它的思考,這不會在工作野牛要麼 - 令牌分裂已經發生(在柔性);但是,我認爲有一種方式來REJECT令牌,迫使柔性嘗試了第二最佳匹配。

這裏是我的ANTLR語法。

grammar command_string; 

start 
    : commandParam* EOF 
    ; 
commandParam 
    : IDENTIFIER '=' CONTINUOUS_VALUE 
    ; 
IDENTIFIER 
    : ('-'|'_'|'a'..'z'|'A'..'Z'|'0'..'9')+ 
    ; 
CONTINUOUS_VALUE 
    : ~(ALL_WS)+ 
    ; 
WS 
    : (ALL_WS) +  { $channel = HIDDEN; } 
    ; 
fragment ALL_WS  
    : ' ' | '\t' | '\r' | '\n' 
    ; 

回答

1

你有CONTINUOUS_VALUE和標識(在標識字符是CONTINUOUS_VALUE的一個子集,有可能是一對夫婦的方式來解決這個問題。一種方法是用啓動CONTINUOUS_VALUE之間有一些重疊的「=」然後剝離出來的文字在CSHARP它是這樣的:。

CONTINUOUS_VALUE 
    : '=' ~(ALL_WS)+ { Text = Text.Substring(1, Text.Length - 1); } 
    ; 

然後只取「=」走出commandParam規則

第二屆辦法是使標識符和CONTINUOUS_VALUE解析器規則(小寫至少是冷杉t字母),那麼你有上下文來找出哪一個應該匹配。你也許能夠使它們成爲碎片,並在commandParam中引用它們,但是我不確定是否可以嵌套碎片,因爲你已經有了ALL_WS碎片。

另外,不要你需要某種形式的NameValue對之間的分隔符的?

+0

空格是分隔符 - 這就是爲什麼它不是在價值觀的身體允許的。用'='字符開始這個值聽起來像是個好主意。我會嘗試的。 – 2009-09-04 12:01:38