簡體   English   中英

如何確定語言是否為LL(1)LR(0)SLR(1)

[英]How to determine whether a language is LL(1) LR(0) SLR(1)

有沒有一種簡單的方法可以僅通過查看語法來確定語法是否為LL(1),LR(0),SLR(1)...?

例如:要確定BNF語法是否為LL(1),您必須計算“第一”和“第二”集-在某些情況下可能很耗時。

有人知道如何更快地執行此操作嗎? 任何幫助將不勝感激!

首先,是一些修腳。 您不能通過檢查語法來確定語言是否為LL(1),您只能對語法本身進行聲明。 對於存在LL(1)語法的語言,完全有可能編寫非LL(1)語法。

順便說一句:

  • 您可以為語法編寫一個解析器,並讓程序為您首先計算並遵循集合和其他屬性。 畢竟,這是BNF語法的最大優勢,它們是機器可理解的。

  • 檢查語法並查找是否違反各種語法類型的約束。 例如:LL(1)允許右遞歸,但不允許左遞歸,因此,包含左遞歸的語法不是LL(1)。 (對於其他語法屬性,您將不得不花一些時間在定義上,因為我現在不記得其他事情了:)。

回答您的主要問題:對於一個非常簡單的語法,無需構造FIRST和FOLLOW集就可以確定它是否為LL(1),例如

A→A + A | 一種

不是LL(1),而

A→一個| b

是。

但是,當您變得比這更復雜時,就需要進行一些分析。

A→B | 一種
B→A + A

這不是LL(1),但可能不會立即顯而易見

算術的語法規則很快變得非常復雜:

expr→術語{'+'術語}
項→因子{'*'因子}
因子→數| '('expr')'

該語法僅處理乘法和加法,並且尚不清楚語法是否為LL(1)。 仍然可以通過查看語法來評估它,但是隨着語法的發展,它變得不太可行。 如果我們要為整個編程語言定義語法,那么幾乎可以肯定,它將進行一些復雜的分析。

就是說,有一些明顯的跡象表明語法不是LL(1)-就像上面的A→A + A一樣-如果您可以在語法中找到任何這些語法,則您將知道它需要重寫如果您正在編寫遞歸下降解析器。 但是沒有捷徑可以驗證語法是否為 LL(1)。

直接來自Aho等人的《編譯器:原理,技術和工具》一書。

第223頁

只有當A-> alpha | |時,語法G才是LL(1)。 beta是G的兩個不同產生,滿足以下條件:

  1. 對於沒有終端“ a”的情況, alphabeta都派生以“ a”開頭的字符串
  2. 最多alphabeta之一可以派生空字符串
  3. 如果beta可以通過零個或多個轉換達到空轉換,則alpha不會派生以FOLLOW(A)中的終端開頭的任何字符串。 同樣,如果alpha可以通過零個或多個轉換達到空轉換,則beta不會以FOLLOW(A)中的終端開頭得出任何字符串

本質上,這是驗證語法是否通過成對不相交測試,並且不涉及左遞歸。 或者更簡潔地說,左遞歸或歧義的語法G不能為LL(1)。

一方面,“是語言/語法是否模棱兩可”,是一個已知的無法確定的問題,例如“ 郵政”對應關系停止問題。

檢查語法是否模棱兩可。 如果是,則語法不是LL(1),因為沒有歧義語法是LL(1)。

ya有ll(1)語法的快捷方式

1)如果A-> B1 | B2 | ... | Bn則first(B1)交集first(B2)交集.first(Bn)=空集,則為ll(1)語法

2)如果A-> B1 | epsilon,則B1相交跟隨(A)為空

3)如果G是使每個非終端僅導出一個乘積的語法,則該語法為LL(1)

p0 S' → E
p1 E → id
p2 E → id ( E )
p3 E → E + id
  • 構造LR(0)DFA,E的FOLLOW集合和SLR動作/定位表。
  • 這是LR(0)語法嗎? 證明你的答案。
  • 使用SLR表,顯示LR解析器解析的步驟(移位,減少,接受):
    id ( id + id )

暫無
暫無

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

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