我有以下的檸檬語法(從實際語法簡化):如何從檸檬語法中刪除函數調用歧義?
%right ASSIGN .
%nonassoc FN_CALL .
program ::= expression .
expression ::= expression ASSIGN expression .
expression ::= function_call . [FN_CALL]
expression ::= IDENTIFIER .
function_call ::= expression LPAREN RPAREN . [FN_CALL]
我不能夠解決在下面的狀態轉變,減少衝突:
State 3:
expression ::= expression * ASSIGN expression
(1) expression ::= expression ASSIGN expression *
function_call ::= expression * LPAREN RPAREN
ASSIGN shift 1
LPAREN shift 4
LPAREN reduce 1 ** Parsing conflict **
{default} reduce 1
我的想法是問題是a =(b(c))和(a = b)(c)之間的不確定性,但是我認爲賦予函數調用比賦值更高的優先級會解決它。任何想法可能是這種情況?
我只用括號來表示含糊不清;我試圖展示的兩個可能的解析樹是頂級表達式是其表達式爲「a = b」的函數調用,以及頂級表達式是其第一個表達式是標識符並且其第二個表達式是第二個表達式是一個函數調用。 即使在這個小小的語法中,問題也顯現出來;如果按原樣編譯,則會出現衝突。 – Topoli 2010-10-28 01:02:33