[英]Deterministic Pushdown Automata for L = a^nb^n | n >=0) Python Program
以下是如何使用以下狀態、stck 符號和轉換 function 為 CFL a^nb^n
實現 class DPDA :
class DPDA:
def __init__(self, trf, input, state):
self.head = 0
self.trf = {}
self.state = str(state)
self.input = input
self.trf = trf
self.stack = ['Z']
def step(self):
a = self.input[self.head] #if slef.head >= 0 and self.head < len(self.tape)
s = self.stack.pop()
state, ss = self.trf.get((self.state, a, s))
if ss != 'ε':
for s in ss[::-1]:
self.stack.append(s)
self.state = state
print('{:20s} [{:10s}] {:5s}'.format(self.input[self.head:],
''.join(self.stack), self.state))
self.head += 1
def run(self):
print('{:20s} [{:10s}] {:5s}'.format(self.input[self.head:],
''.join(self.stack), self.state))
while self.head < len(self.input):
self.step()
s = self.stack.pop()
if self.trf.get((self.state, 'ε', s)):
state, ss = self.trf.get((self.state, 'ε', s))
self.state = state
print('{:20s} [{:10s}] {:5s}'.format('ε',
''.join(self.stack), self.state))
# run DPDA to accept the input string a^9b^9
DPDA({('q', 'a', 'Z'): ('q', 'XZ'),
('q', 'a', 'X'): ('q', 'XX'),
('q', 'b', 'X'): ('p', 'ε'),
('p', 'b', 'X'): ('p', 'ε'),
('p', 'ε', 'Z'): ('acc', 'Z'),
},
'aaaaaaaaabbbbbbbbb', 'q').run()
#input #stack #state
#aaaaaaaaabbbbbbbbb [Z ] q
#aaaaaaaaabbbbbbbbb [ZX ] q
#aaaaaaaabbbbbbbbb [ZXX ] q
#aaaaaaabbbbbbbbb [ZXXX ] q
#aaaaaabbbbbbbbb [ZXXXX ] q
#aaaaabbbbbbbbb [ZXXXXX ] q
#aaaabbbbbbbbb [ZXXXXXX ] q
#aaabbbbbbbbb [ZXXXXXXX ] q
#aabbbbbbbbb [ZXXXXXXXX ] q
#abbbbbbbbb [ZXXXXXXXXX] q
#bbbbbbbbb [ZXXXXXXXX ] p
#bbbbbbbb [ZXXXXXXX ] p
#bbbbbbb [ZXXXXXX ] p
#bbbbbb [ZXXXXX ] p
#bbbbb [ZXXXX ] p
#bbbb [ZXXX ] p
#bbb [ZXX ] p
#bb [ZX ] p
#b [Z ] p
#ε [Z ] acc
下一個 animation 顯示了字符串是如何被上述 DPDA 接受的:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.