簡體   English   中英

確定性無上下文語法與無上下文語法?

[英]Deterministic Context-Free Grammar versus Context-Free Grammar?

我正在讀我的比較語言課的筆記,我有點困惑......

無上下文語法和確定性無上下文語法之間有什么區別? 我特別在閱讀解析器如何用於CFG的解析器是O(n ^ 3),並且編譯器對於DCFG來說是O(n),並且並不真正理解時間復雜度的差異是如何的那么好(更不用說我是仍然混淆了使CFG成為DCFG的特征。

非常感謝你提前!

從概念上講,它們很容易理解。 無上下文語法是可以用BNF表達的語法。 DCFG是可以編寫可行解析器的子集。

在編寫編譯器時,我們只對DCFG感興趣。 原因是'確定性'大致意味着在解析中的任何一點應用的下一個規則是由目前的輸入和有限量的前瞻確定的。 Knuth在20世紀60年代發明了LR()編譯器並證明它可以處理任何DCFG。 從那時起,一些改進,特別是LALR(1)和LL(1),已經定義了可以在有限的內存中解析的語法,以及我們可以編寫它們的技術。

我們還有從BNF自動派生解析器的技術,如果我們知道它是這些語法之一。 Yacc,Bison和ANTLR是熟悉的例子。

我從來沒有見過NDCFG的解析器,但是在解析的任何一點,它都可能需要考慮整個輸入字符串和可能應用的每個可能的解析。 不難看出為什么會變得相當大而緩慢。


我應該指出,許多真正的語言是不完美的,因為它們不是完全沒有上下文,不是明確的或者不同於理想的DCFG。 C / C ++是一個很好的例子,但還有很多其他的。 這些語言通常由特殊用途規則處理,例如語義或句法謂詞,特殊情況回溯或其他“技巧”,對性能沒有影響。


評論指出某些類型的NDCFG是常見的,許多工具提供了一種處理它們的方法。 一個常見問題是模棱兩可。 通過引入簡單的本地語義規則來解析模糊語法相對容易,但當然這只能生成一個可能的解析樹。 NDCFG的通用解析器可能會產生所有解析樹,並且可能允許在某些任意條件下過濾這些樹。 我不知道其中任何一個。

左遞歸不是NDCFG的特征。 它對LL()解析器的設計提出了特殊的挑戰,但LR()解析器沒有問題。

暫無
暫無

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

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