有错误处理功能的非递归下降语法分析器
上一篇《有错误处理功能的递归下降语法分析器》的继续 相信不少同学们是第二次看见我了 笑
上一篇传送门有错误处理功能的递归下降语法分析器
这次的要求:
同步记号集合,i,list来模拟一个栈的想法与上一篇一样,nextToken函数略加修改,删掉了根本用不上的返回值部分。
test为输入式
总的思想就是从左向右扫描一遍输入式,根据有同步记号的分析表针对不同的情况作出不同的处理
chart={"E id":"T E1","E1 id":-1,"T id":"F T1","T1 id":-1,"F id":"id",
"E +":-1,"E1 +":"+ T E1","T +":"synch","T1 +":0,"F +":"synch",
"E *":-1,"E1 *":-1,"T *":-1,"T1 *":"* F T1","F *":"synch",
"E (":"T E1","E1 (":-1,"T (":"F T1","T1 (":-1,"F (":"( E )",
"E )":"synch","E1 )":0,"T )":"synch","T1 )":0,"F )":"synch",
"E #":"synch","E1 #":0,"T #":"synch","T1 #":0,"F #":"synch"
}
i=0
stack = []
stack.append("#")
stack.append("E")
test="id+id+id#"
def nextToken(originStr):
global i
if (originStr[i] == 'i'):
i=i+2
else:
i=i+1
while (stack[len(stack) - 1] != "#"):
if (test[i] == "i"):
temp = "id"
else:
temp = test[i]
tempString = stack[-1] + " " + temp
if (stack[-1] == temp):
stack.pop(-1)
nextToken(test)
for everyOne in stack:
print(everyOne, end=" ")
print("")
# elif(stack[-1]=="+"or"id"or"*"or"("or")"):
# pass
elif(stack[-1]==")"):
print("ERROR:弹栈,弹出终结符 ),括号不匹配 ")
stack.pop(-1)
elif (chart[tempString] == -1):
print("ERROR: 输入串跳过记号%s,用户多输入了%s" % temp, temp)
nextToken(test)
elif (chart[tempString] == 0):
stack.pop(-1)
for everyOne in stack:
print(everyOne, end=" ")
print("")
elif (chart[tempString] == "synch"):
print("ERROR: 弹栈,弹出非终结符" + stack[-1] + "用户少输入了" + temp)
stack.pop(-1)
else:
stack.pop(-1)
temp_list = chart[tempString].split()
num = len(temp_list) - 1
while (num > -1):
stack.append(temp_list[num])
num = num - 1
for everyOne in stack:
print(everyOne, end=" ")
print("")