【问题标题】:Rules to convert a CFG to a NDPA?将 CFG 转换为 NDPA 的规则?
【发布时间】:2018-06-10 11:15:01
【问题描述】:

我必须使用这个语法来定义一个 FA:

S -> aSb
S -> c
S -> dA
A -> Sd

如何管理第一条规则和最后一条规则? 对于第二个,我认为我必须创建另一个状态(最后一个)并将 S 和这个新状态联系起来。对于第三个,我认为我必须创建状态“A”并通过传递“d”将其链接到 S。

【问题讨论】:

  • 您的问题标题表明您有 LLG,但您肯定没有。你在问什么?您是在问如何为该语法制作有限自动机吗?这种语法不规则。
  • 您好,由于最后一条规则,我认为这是左线性语法。如何继续创建 FA?
  • 没有一个 LLG 是其中 all 规则,而不仅仅是一个,左侧有一个非终结符。您无法使用此语法创建 FA。语法不规则(因为第一条规则)。不存在 FA。不过,您可以制作 NDPA,因为该语言绝对是上下文无关的。你从哪里得到这个问题的?
  • 如果我要创建 NDPA,我应该遵循哪些规则?
  • 你可以在网上找到几十个教程和例子。我刚刚在 Google 上搜索了“如何从 CFG 制作 NPDA”并获得了相当多的点击率。

标签: parsing grammar dfa nfa


【解决方案1】:

您可以使用一些算法从 CFG 获取 PDA:例如,查看自上而下和自下而上的解析器。我认为 PDA 接受 CFG 生成的语言(反之亦然)的通常证明使用了这种结构。

另一种方法是理解由语法生成的语言,并直接为其设计 PDA。这不那么机械,但有可能产生更简洁的 PDA。如果你想走这条路,我们可以首先通过识别非终结符 A 可以安全地替换为它的唯一产生式的 RHS 来简化语法:

S -> aSb
S -> c
S -> dSd    // removed A -> Sd and replaced here

这个语法是如何工作的?

  1. 你在第二个生产的中间有c
  2. c 左右两边都有匹配的ds;
  3. 您的左侧有as 与c 右侧的bs 匹配。

PDA 应按以下方式工作:

  1. 阅读as 和ds,直到看到c。随时将所有内容推入堆栈。当您看到c 时,转到下一个状态,但不要推送c
  2. 读取bs 和ds,从堆栈中弹出as 和ds,直到:
    • 最顶部的堆栈符号与输入不匹配;崩溃。
    • 您的输入用完了,符号仍在堆栈上;崩溃。
    • 您的堆栈符号用完了,还有输入;崩溃。
    • 您同时用完堆栈和输入;接受。

这是一个转换表:

q    s      x    q'   s'
------------------------------
q0   a,d,Z  a    q0   aa,ad,aZ
q0   a,d,Z  d    q0   da,dd,dZ
q0   a,d,Z  c    q1   a,d,Z
q1   a      b    q1   -
q1   d      d    q1   -

如果我们在 q1 中通过空堆栈接受,这些转换就足够了。如果我们想通过空堆栈或接受状态接受,我们可以添加类似f(q1, Z, -) = (q2, Z) 的转换并让q2 接受; PDA 会不确定地转换到那里,除非输入也用尽,否则它会崩溃。

【讨论】:

    猜你喜欢
    • 2021-12-02
    • 1970-01-01
    • 2021-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多