簡體   English   中英

這兩個語法相等嗎?

[英]Is these 2 grammars equal?

我有以下語法是模棱兩可的,當然不是slr1:

E -> E+A+A | E+A-A | E-A+A | E-A-A | T
T -> T+A | T-A | A
A -> A*B | A/B | B
B -> (E) | x

我使用的轉換規則是:

E -> E + T  ----->  E -> TE'
                    E' -> +TE' | ε

所以第一個語法變成這樣:

E -> T E' .
E' -> + A + A E' .
E' -> + A - A E' .
E' -> - A + A E' .
E' -> - A - A E' .
E' -> .
T -> A T' .
T' -> + A T' .
T' -> - A T' .
T' -> .
A -> B A' .
A' -> * B A' .
A' -> / B A' .
A' -> .
B -> ( E ) .
B -> x .

這正在解決歧義性,但它不會繼續是slr1。 轉換是正確的。 之后,我刪除了T規則,並將它們安裝到E'。 因此,最終的語法為slr1如下:

E -> A E' .
E' -> + A + A E' .
E' -> + A - A E' .
E' -> - A + A E' .
E' -> - A - A E' .
E' -> + A .
E' -> - A .
E' -> .
A -> B A' .
A' -> * B A' .
A' -> / B A' .
A' -> .
B -> ( E ) .
B -> x .

現在我有兩個問題。

  1. 2個最終語法相等 我通過說這兩個語法必須接受相同的句子來定義平等。 看來他們做到了。
  2. 我刪除了T規則是否正確? 我的練習要求我將第一個更改為slr1,然后我想到的只是最后一個。 謝謝,謝謝我的英語。

我希望您的任務被提供良好反饋的人標記。 我想相信高等教育在某些地方仍然有效,但這顯然是一種幻想。

無論如何。 您最終得到的語法是提出該問題時的有效解決方案,但是該解決方案基於錯誤的觀念和錯誤,錯誤的觀念和錯誤會相互抵消,從而產生有效的結果。

首先是誤解:左遞歸與歧義不相同,因此左分解和消除左遞歸並不能消除歧義。 特別是,您聲稱“這正在解決歧義,但它仍然不是SLR(1)”是錯誤的。 轉換並不會消除歧義。 語法仍然不是SLR(1),因為它仍然模棱兩可。

E                   E
T E'                T E'
A T' E'             A T' E'
B A' T' E'          B A' T' E'
x A' T' E'          x A' T' E'
x T' E'             x T' E'
x + A T' E'         x E'
x + B A' T' E'      x + A + A E'
x + x A' T' E'      x + B A' + A E'
x + x T' E'         x + x A' + A E'
x + x + A T' E'     x + x + A E'
x + x + B A' T' E'  x + x + B A' E'
x + x + x A' T' E'  x + x + x A' E'
x + x + x T' E'     x + x + x E'
x + x + x E'        x + x + x
x + x + x

錯誤是刪除了T規則。 你開始

E -> T E' .
T -> A T' .
T' -> + A T' .
T' -> - A T' .
T' -> .

由此,您可以輕松擦除T ,因為它僅在一個地方使用:

E -> A T' E'.
T' -> + A T' .
T' -> - A T' .
T' -> .

但是,擦除T'並不是那么簡單,因為它是遞歸的。 而且,無論如何, E'沒有任何使用T' ,因此向E'添加新產品並不是對T'的機械消除。

但是,實際上,您選擇添加到E'確實消除了歧義。 從這個意義上說,做得很好。 但是請注意,如果沒有消除左遞歸,您可以做到這一點:

E -> E + A + A .
E -> E + A - A .
E -> E - A + A .
E -> E - A - A .
E -> A + A .
E -> A - A .
E -> A .
A -> A * B .
A -> A / B .
A -> B .
B -> ( E ) .
B -> x .

該語法是明確的,出於相同的原因,您也是如此: +-運算符被分解為三元運算序列,可能在其后是單個二進制運算符(如果加法運算符序列包含奇數個運算符)。 但這不是SLR(1)。 實際上,對於任何k都不是LR(k),因為在我們知道是否存在偶數或奇數個運算符之前,不可能知道操作序列應以三進制還是二進制運算開始。

但是我們可以通過使加法運算符正確關聯來解決該問題(實際上,以與您的語法相同的方式):

E -> A + A + E .
E -> A + A - E .
E -> A - A + E .
E -> A - A - E .
# Rest of the grammar is the same

當然,這種語法不是LL(1);它不是LL(1)。 它不是左撇子。 但是最初的問題不需要LL(1)語法,而上面的是SLR(1)。

但是,這僅僅是對原始歧義語法的一種可能的解釋,而且很可能不是最自然的一種,因為右聯想通常不是自然的解釋。 除非問題指定了所需的關聯性,否則無法知道所需的內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM