2012-03-21 70 views
0

假設我有以下上下文無關文法,在那個特定的順序(YACC):LR分析器降低/減少(YACC等)

  • Ž→X
  • Ž→ZX

如果我有一個輸入:

(Z(ZX

將解析器減少:

  1. 'X' 到 'Z'
  2. 'Z X' 到 'Z'

我想到的是它的2號,但我不明白爲什麼。非常感謝

編輯:改變輸入澄清

+1

如果你有'z z x'的輸入,你的解析器會反對z是一個未知符號(因爲它是一個規則,而不是一個標記)。 – 2012-03-21 21:46:10

回答

1

你的語法是向左結合的,因爲它是左遞歸。左聯合意味着當輸入從左到右掃描時,產品將會貪婪地完成。你總是有一個z,它通過掃描另一個x並減少,延長到更長的z

關於你的問題,你不能有一個輸入z z x,因爲輸入由終端符號組成。據推測,x是一個終端符號(否則語法不完整)。 z顯然是非終結符。

你可以考慮部分句子形式z z x。然而,這種形式不能由這個語法產生。

z開始,您的下一步是生成x(並因此完成)或生成z x。接下來可能的步驟是用以下兩種方法之一替換z:生成x x(並完成)或生成z x x

正如您所見,這些規則無法訪問字符串z z x

+0

讓我嘗試更改輸入,然後可能會更有幫助.. 讓我們假設輸入是:(z(zx – teh0wner 2012-03-22 13:03:42

+0

)這是一個語法錯誤,因爲在語法中沒有關於左括號的內容 – Kaz 2012-03-22 17:57:18

+0

正確。假設輸入是zx,它應該消除關聯性的任何不明確性,並且如果存在這種模糊性,讓我們假設它是右聯合的,即它首先查看最右邊的標記。 – teh0wner 2012-03-23 14:42:29