2013-04-09 18 views
1

我想分析和簡單的文本行這樣讀截流值:antlr3 - 讀截流值的變量

1東西

line 
    : (NUMBER EXCLAMATION myText=~('\r\n')*) 
{ myFunction($myText.text); } 

NUMBER 
    : '0'..'9'+; 

EXCLAMATION 
    : '!'; 

得到什麼! myText變量只是'something'的最後'g',因爲可以在生成的代碼中看到myText在每個發生的〜('\ r \ n')的while循環中重新編譯。

我的答案是:是否有任何優雅的方式來讀取變量'myText'的'something'值?

TIA

回答

1

裏面的語法規則,該~並不否定字符,但令牌。因此~('\r\n')將匹配除字面'\r\n'標記以外的任何標記(在您的示例中,這將是NUMBEREXCLAMATION)。

解析器不能「驅動」詞法分析器:在解析器匹配NUMBEREXCLAMATION之後,您無法告訴詞法分析器產生比先前所做的其他一些令牌。無論解析器「需要」什麼,詞法分析器都會根據some simple rules生成令牌。

換句話說:你不能在解析器中處理這個問題。