有错误处理功能的非递归下降语法分析器

上一篇《有错误处理功能的递归下降语法分析器》的继续 相信不少同学们是第二次看见我了 笑

上一篇传送门有错误处理功能的递归下降语法分析器

这次的要求:

有错误处理功能的非递归下降语法分析器

 

同步记号集合,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("")