2010-03-31 42 views

回答

2

是的,你可以在詞法規則裏面使用遞歸。

採取下面的例子:

${a ${b} ${c ${ddd} c} a} 

這將正確地由以下語法解析:

parse 
    : DollarVar 
    ; 

DollarVar 
    : '${' (DollarVar | EscapeSequence | ~Special)+ '}' 
    ; 

fragment 
Special 
    : '\\' | '$' | '{' | '}' 
    ; 

fragment 
EscapeSequence 
    : '\\' Special 
    ; 

作爲內部ANTLRWorks解釋示出了:

alt text http://img185.imageshack.us/img185/5471/recq.png

0

ANTLR的詞法分析器支持遞歸,正如@BartK在他的文章中熟練地指出的那樣,但在分析器中只能看到一個單一的標記。如果您需要解釋該令牌中的各個部分,您可能需要在解析器中處理它。

IMO,你會更好的解析器做的事情:

variable: DOLLAR LBRACE id variable id RBRACE; 

通過做一些像上面,你會看到所有必要的片,可以建立一個AST或其他相應處理。

+0

不太。在。ANTLR中,'。*'和'。+'默認是非貪婪的。試試ANTLRWorks中的字符串'$ {a $ {b} c}'的解釋器。你會發現它匹配'$ {a $ {b}'而不是整個字符串'$ {a $ {b} c}'。請參閱Parr的ANTLR參考文獻,第4章,**擴展的BNF Subrules **,第86頁。 – 2010-03-31 20:59:42

+0

@BartK我現在明白了。感謝您的澄清。 – 2010-03-31 22:18:08

+0

不客氣! – 2010-04-01 05:25:16