我必须使用这个语法来定义FA:
findDocuments(db, function(docs) {
console.log(docs);
client.close();
});
如何管理第一条规则和最后一条规则? 对于第二个,我认为我必须创建另一个状态(最后一个)并链接S和这个新状态。对于第三个,我认为我必须创建状态“A”并通过传递“d”将其链接到S.
答案 0 :(得分:0)
您可以使用算法从CFG获取PDA:例如,查看自上而下和自下而上的解析器。我认为PDA是接受CFG生成的语言的通常证明,反之亦然,使用这种结构。
另一种方法是理解语法生成的语言,并直接为它设计PDA。这不太机械,但有可能产生更简洁的PDA。如果你想走这条路线,我们可以先通过识别非终结A来简化语法,可以安全地替换为唯一生产的RHS:
S -> aSb
S -> c
S -> dSd // removed A -> Sd and replaced here
这个语法是如何工作的?
c
; d
; c
a
位于b
右侧的c
左侧。PDA的工作方式如下:
a
和d
s,直至看到c
。随时随地推送堆栈中的所有内容。当您看到c
时,请转到下一个州,但不要推送c
。b
和d
s,从堆栈中弹出a
和d
,直到:
这是转换表:
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会在不确定的情况下进行转换并崩溃。