Compiler construction PDA:如何检查POP的数量是偶数还是奇数

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 |

假设我们有上下文无关语言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            |             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