【问题标题】:Is there a type of parser generator that handles all deterministic context-free grammars?是否有一种解析器生成器可以处理所有确定性上下文无关语法?
【发布时间】:2021-08-04 18:45:10
【问题描述】:

我需要一种为所有确定性上下文无关文法生成解析器的方法。

我知道每个确定性上下文无关文法都可以被某个 LR(k) 解析器解析。问题是我需要为未知的语法生成解析器k。因此,要处理每个确定性上下文无关文法,k 需要是无限的。

我也知道 GLR 解析器可以解析所有上下文无关文法,无论是否确定。但我需要拒绝非确定性语法。我不确定 GLR 是否可以从输入语法中检测到该属性。

是否有一种解析器生成器可以处理所有确定性上下文无关文法,同时拒绝非确定性文法,而不需要 k 输入? (唯一的输入是语法本身)

【问题讨论】:

    标签: parsing context-free-grammar parser-generator lr glr


    【解决方案1】:

    令人惊讶的是,“给定一个 CFG,决定它是否是任何 k 的 LR(k)”的问题是不可判定的!这意味着任何解析器生成器都不可能总是能够采用任意语法并确定要使用哪个 k 选择,或者即使存在这样的 k 选择。

    在实践中,对于“相当接近”的某些定义,我们关心的大多数语法都非常接近 LR(1),这就是为什么大多数解析器生成器都专注于更简单的情况。

    【讨论】:

    • 怎么会这样?任何 CFG 都可以转换为 PDA,对吗?根据维基百科 (en.wikipedia.org/wiki/Deterministic_pushdown_automaton),“对于输入符号、状态和顶部堆栈符号的相同组合,确定性下推自动机最多有一个合法转换。”那么,我不能直接将CFG 转换为PDA,然后检查PDA 是否符合上述标准吗?如果是这样,我知道它是一个确定性 PDA,这意味着 CFG 是确定性的,这意味着它是 LR(k)。我的想法有什么问题?
    • @joshua:任何 CFG 都可以转换为 NPDA。有时这会导致 DPDA。但是,该算法没有碰巧产生 DPDA 这一事实并不表明它不存在。
    • 啊,好吧。谢谢你的解释。
    • 其实我觉得GLR解析器生成器比LR(2)生成器多。但是,如果您知道一大群 LR(2) 生成器(甚至是一个好的生成器),请告诉我 :-)
    猜你喜欢
    • 1970-01-01
    • 2015-04-25
    • 1970-01-01
    • 1970-01-01
    • 2011-03-31
    • 1970-01-01
    • 2014-04-26
    • 1970-01-01
    • 2016-07-12
    相关资源
    最近更新 更多