2013-09-21 58 views
0

我想出了以下語法強制執行優先級:如何修復我寫的語法?

A : L ('[' A ']' L*)* 
L : M (('+'|'-')M)* 
M : P (('*'|'/')P)* 
P : ID | NUM 

其中ID可以是字母,而num是一個整數。

問題

我可以分析以下字符串:

a[i + 1] 

我無法解析以下字符串:

a[i] + 1 or a[a[i]*i] 

我的問題是,引入了遞歸問題。因爲我不想回溯。我必須通過重寫語法來解決這個問題。我一直在看這個link。但是,我嘗試修復也不起作用。有人可以幫忙嗎?

嘗試的解決方案:

A : L ('[' A ']')* | L*` and let `Z = ('[' A ']')* 

不過,我認爲這改變了我的語法定義,仍然是左遞歸併不允許我解決a[i] + 1 or a[a[i]*i]

附加信息:

我實際上是在antlr中實現它。我試圖用syntatic謂詞來解決這個問題,但這並沒有幫助。也許我沒有正確使用它們?

我會繼續在這個問題上有所斬獲,但我越想越多,我就會感到困惑。有人可以幫幫我嗎?這是一個概念性問題,我想如何正確設置沒有回溯的語法。但是如果我想要正確地製作我自己的定製工具,我將不得不這樣做。

回答

1

你不會有一個問題,當你移動索引來的ID代替L生產之後:

A : L 
L : M (('+'|'-') M)* 
M : P (('*'|'/') P)* 
P : ID I | NUM 
I : ('[' A ']')* 

這將解析所有的你提供的3個輸入例子:

  1. a[i + 1]
  2. a[i] + 1
  3. a[a[i]*i]