算法:LR分析
输入:输入序列w和文法G的LR分析表action和goto
输出:若w属于L(G),得到w的规范规约,否则指出一个错误
方法:初始格局为(#0, w#, 驱动器的第一个动作),其中0是初始状态。令ip指向w#中的第一个终结符,top指向栈顶初始状态
import copy
#输入输入序列w 和预测分析表M ,非终结符的集合N ,开始进行预测分析
def LR_analyze(w, LR ,P):
mat = "步骤{:<15}\t栈内容 {:<20}\t当前输入 {:<25}\t动作{:<30}"
print(mat.format(" "," "," "," ",))
Stack = list() # 创建符号栈
Stack.append('#')#压入结束表示符#
Stack.append('0')#压入状态0
top = len(Stack)-1 #top用于记录栈顶的下标,即最后一个元素下标
ip = 0#用于记录输入序列w中的终结符的下标,从首部开始
step = 1 #记录步骤
# 当栈非空
while Stack:
content = ''.join(Stack)#将栈内容转为字符串
inputchar = ''.join(w[ip:])
action = ""
accept = False #表示是否成功返回
a = w