2012-06-12 115 views
0

我想用ANTLR寫一個語法,但我不明白antlr如何與遞歸選擇一起工作。Antlr和左遞歸規則

我閱讀了大量的文章和論壇,但解決不了我的問題......

這裏是我的語法的一小部分:

grammar MyGrammar; 

ComponentRef : 
    IDENT ('[' Expression (',' Expression)* ']')? 
; 

Expression: 
    ComponentRef ('(' FunctionArguments ')')? 
; 

FunctionArguments: 
    Expression (',' Expression)* 
; 

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

我還是不明白爲什麼它不起作用......沒有歧義!不是嗎?

下面是一些代碼示例我的語法應該一起工作:

a 
a[b,c] 
a[b[c], d] 
func(a) 
func(a,b,c) 
func[a](b,c) 
func(a[b], c[d]) 
func[a](b[c]) 

通過提前謝謝!

回答

3

我聽起來有點生硬,但我不相信你會閱讀很多文章(至少不是正確的),因爲你似乎不知道詞法分析器和解析器規則之間的區別。要確保你理解:Practical difference between parser rules and lexer rules in ANTLR?

也會檢出該SO Q &答:ANTLR Tutorials

您只使用詞法規則,這是不正確的。雖然即使是詞法分析器規則可以遞歸(在ANTLR語法中),你真的應該避免它。在你的情況下,大部分的規則應該是語法規則,而不是:

componentRef : 
    IDENT ('[' expression (',' expression)* ']')? 
; 

expression: 
    componentRef ('(' functionArguments ')')? 
; 

functionArguments: 
    expression (',' expression)* 
; 

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

語法上面不會承認你張貼的所有輸入,但沒有錯誤了。承認你張貼的所有輸入端的語法,看起來是這樣的(未經測試!)語法:

parse 
: expr* EOF 
; 

expr 
: IDENT (index | call)* 
; 

index 
: '[' expr_list ']' 
; 

call 
: '(' expr_list ')' 
; 

expr_list 
: expr (',' expr)* 
; 

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

SPACE 
: (' ' | '\t' | '\r' | '\n')+ {skip();} 
; 
+0

Dead link re:「ANTLR Tutorials」 –

+1

@Jared,問答已被刪除:將其替換爲archive.org中副本的鏈接 –

0

我假設你的國會大廈表達式是錯誤的。你可能打算輸入小寫字母。

你怎麼能說沒有歧義?表達式調用functionArguments,functionArguments調用表達式。 -1