[英]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的兩個不同產生,滿足以下條件:
本質上,這是驗證語法是否通過成對不相交測試,並且不涉及左遞歸。 或者更簡潔地說,左遞歸或歧義的語法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
id ( id + id )
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.