编译原理 课程设计——基于预测分析方法的表达式语法分析器(python))
程序员文章站
2022-07-13 17:34:36
...
编译原理 课程设计(python)
基于预测分析方法的表达式语法分析器
import queue as q
prod_table = {
'S': {
'm': 'AT',
'(': 'AT'
},
'T': {
'+': '+AT',
')': '$',
'#': '$'
},
'A': {
'm': 'BU',
'(': 'BU'
},
'U': {
'+': '$',
')': '$',
'#': '$',
'*': '*BU'
},
'B': {
'm': 'm',
'{': '(S)'
}
}
def print_line(cnt, stack, string, p):
print(cnt, end='\t')
cache = q.LifoQueue()
stack_value = ''
while not stack.empty():
value = stack.get()
cache.put(value)
while not cache.empty():
value = cache.get()
stack.put(value)
stack_value += value
#print(value, end='')
print('{0:5}'.format(stack_value), end='')
print(' \t', end='')
print('{0:10}'.format(string[p:]), end='')
# print(string[p:], end=' \t')
def main(string):
p = 0
cnt = 0
stack = q.LifoQueue()
stack.put('#')
stack.put('S')
while 1:
cnt += 1
print_line(cnt, stack, string, p)
X = stack.get()
if X not in prod_table.keys() or X == '#': # 栈顶为非终结符
if X == string[p]:
if string[p] == '#':
print('【ACCEPT】')
exit()
else: # 消去
p += 1
print(X, 'Match')
else:
print('\n【Error】:Stack and string not match!')
exit()
else: # 栈顶为终结符
try:
production = prod_table[X][string[p]]
if production == '$':
pass
else:
for j in range(len(production)):
stack.put(production[-j-1])
print('Use the production', X, '->', production)
except KeyError:
print('\n【Error】 syntax error: production not found')
exit()
if __name__ == '__main__':
input_string = 'm+m*m#'
main(input_string)
上一篇: 被女朋友三番五次拉黑后,我用 Python 写了个“舔狗”必备神器
下一篇: 分割List集合