[英]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 .
現在我有兩個問題。
我希望您的任務被提供良好反饋的人標記。 我想相信高等教育在某些地方仍然有效,但這顯然是一種幻想。
無論如何。 您最終得到的語法是提出該問題時的有效解決方案,但是該解決方案基於錯誤的觀念和錯誤,錯誤的觀念和錯誤會相互抵消,從而產生有效的結果。
首先是誤解:左遞歸與歧義不相同,因此左分解和消除左遞歸並不能消除歧義。 特別是,您聲稱“這正在解決歧義,但它仍然不是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.