Compiler construction PDA:如何检查POP的数量是偶数还是奇数
假设我们有上下文无关语言L={0^n0^n,n>=0} 对于PDA:Μ={A,Q,H,δ,q0,h0,F}我们有:Compiler construction PDA:如何检查POP的数量是偶数还是奇数,compiler-construction,pushdown-automaton,Compiler Construction,Pushdown Automaton,假设我们有上下文无关语言L={0^n0^n,n>=0} 对于PDA:Μ={A,Q,H,δ,q0,h0,F}我们有: A = {"0"} H = {X, I} Q = {S, T} q0 = S h0 = X F = {T} Then, the δ function is: ___________________________________________________________________ | X |
A = {"0"}
H = {X, I}
Q = {S, T}
q0 = S
h0 = X
F = {T}
Then, the δ function is:
___________________________________________________________________
| X | I | -| |
---+------------------------+--------------------------+-------------|
S | read("0")=> push(I) | read("0")=> push(I) | |
| keep=> move(T) | pop | |
---+------------------------+--------------------------+-------------|
T | | | success |
---------------------------------------------------------------------+
这是我的解决方案,但它有一个问题。自动机必须接受字符串,例如
00,ε,0000,不带0或000。通常使用0数为偶数的字符串
让我们尝试两个示例:
->for string 00:
MOVE STACK INPUT STATE DESCRIPTION_OF_MOVE
1 X '0'0 S reading_of 0
2 XI '0' S reading_of 0
3 XII ε S pop
4 XI ε S pop
5 X ε S ε-transition
6 X ε T success
->for string 000:
MOVE STACK INPUT STATE DESCRIPTION_OF_MOVE
1 X '0'00 S reading_of 0
2 XI '0'0 S reading_of 0
3 XII '0' S reading_of 0
4 XIII ε S pop
5 XII ε S pop
6 XI ε S pop
7 X ε S ε-transition
8 X ε T success
不应接受最后一个字符串。我不知道如何在识别字符串之前检查POP的数量,以选择是否接受它。有人有什么想法和线索能触发我吗?解决办法很简单。在这种情况下,PDA必须接受偶数个0,包括零个0 为了实现这一点,一个简单的实现方法是,每当出现偶数个0时,从堆栈中弹出符号
I
,因此δ
函数为:
___________________________________________________________________
| X | I | -| |
---+------------------------+--------------------------+-------------|
S | read("0")=> push(I) | read("0")=> pop | |
| keep=> move(T) | | |
---+------------------------+--------------------------+-------------|
T | | | success |
---------------------------------------------------------------------+
让我们尝试以下两个示例:
->for string 00:
MOVE STACK INPUT STATE DESCRIPTION_OF_MOVE
1 X '0'0 S read(0)=> push(I)
2 XI '0' S read(0)=> pop
3 X ε S ε-transition
4 X ε T success
->for string 000:
MOVE STACK INPUT STATE DESCRIPTION_OF_MOVE
1 X '0'00 S read(0)=> push(I)
2 XI '0'0 S read(0)=> pop
3 X '0' S read(0)=> push(I)
4 XI ε S eoi=> failure