将CFG转换为NDPA的规则?

时间:2017-12-30 08:44:19

标签: parsing grammar linear dfa nfa

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

findDocuments(db, function(docs) {
     console.log(docs);
     client.close();
});

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

1 个答案:

答案 0 :(得分:0)

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

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

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

这个语法是如何工作的?

  1. 第二次制作中间有c;
  2. 您在d;
  3. 的左侧和右侧匹配c
  4. 左侧a位于b右侧的c左侧。
  5. PDA的工作方式如下:

    1. 阅读ad s,直至看到c。随时随地推送堆栈中的所有内容。当您看到c时,请转到下一个州,但不要推送c
    2. 阅读bd s,从堆栈中弹出ad,直到:
      • 最上面的堆栈符号与输入不匹配;崩溃。
      • 您的输入用完了仍然在堆栈上的符号;崩溃。
      • 剩余输入的堆栈符号用尽;崩溃。
      • 你用完了堆栈并同时输入;接受。
    3. 这是转换表:

      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会在不确定的情况下进行转换并崩溃。