LR(k)分析器實(shí)現(xiàn)

image.png
import queue

input_dict = {'a':0,'b':1,'#':2,'S':3,'B':4}


shift = 0
merge = 1
accepted = 2


class grammar():
    def __init__(self,left,right):
        self.left = left
        self.right = right
        self.merge_len = len(right)


grammar1 = grammar('S','BB')
grammar2 = grammar('B','aB')
grammar3 = grammar('B','b')


# 有可能是轉(zhuǎn)移或者根據(jù)語法規(guī)約
class action():
    def __init__(self,move_or_merge,state_or_grammer=None):
        self.action = move_or_merge
        self.state_or_grammer = state_or_grammer


line0 = [action(shift,3),action(shift,4),None,action(shift,1),action(shift,2)]
line1 = [None,None,action(accepted),None,None]
line2 = [action(shift,3),action(shift,4),None,None,action(shift,5)]
line3 = [action(shift,3),action(shift,4),None,None,action(shift,6)]
line4 = [action(merge,2),action(merge,2),action(merge,2),None,None]
line5 = [action(merge,0),action(merge,0),action(merge,0),None,None]
line6 = [action(merge,1),action(merge,1),action(merge,1),None,None]


class state_table():
    def __init__(self):
        self.Table = [line0,line1,line2,line3,line4,line5,line6]

class grammer_table():
    def __init__(self):
        self.Table = [grammar1,grammar2,grammar3]

def LR_machine(input_str):
    my_state_table = state_table()
    my_grammer_table = grammer_table()
    stack = queue.LifoQueue()
    stack.put([0,'#'])
    current_state = 0
    str_ptr = 0

    while str_ptr < len(input_str):
        new_input = input_str[str_ptr]
        new_input_index = input_dict[new_input]
        new_action = my_state_table.Table[current_state][new_input_index]
        if new_action.action == shift:
            current_state = new_action.state_or_grammer
            print('stack input:')
            print([current_state,new_input])
            stack.put([current_state,new_input])
            str_ptr += 1
        elif new_action.action == merge:
            while new_action.action == merge:
                # print(new_action.state_or_grammer)
                grammar = my_grammer_table.Table[new_action.state_or_grammer]
                str = ''
                for i in range(grammar.merge_len):
                    # str += stack.get()[1]
                    temp = stack.get()
                    print('output:')
                    print(temp)
                    str = temp[1] + str

                if str == grammar.right:
                    new_input = grammar.left
                    new_input_index = input_dict[new_input]
                    # 新的輸入是語法的左端,再取出新的狀態(tài)
                    temp = stack.get()
                    current_state = temp[0]
                    stack.put(temp)
                    new_action = my_state_table.Table[current_state][new_input_index]
                else:
                    print('error:merge,input is not in grammer\'s right part!')
                    return -1

                new_action = my_state_table.Table[current_state][new_input_index]

            if new_action.action == shift:
                current_state = new_action.state_or_grammer
                print('stack input:1')
                print([current_state, new_input])
                stack.put([current_state, new_input])
            else:
                print('error:!!')
        elif new_action.action == accepted:
            current_state = accepted
            return 0
        else:
            print('error:can\'t find right new_action')
            return -1

    print('error:str run out and not get in accepted state!')
    return -1



def main():
    print(LR_machine('bab#'))


if __name__ == '__main__':
    main()


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 《WestWorld》第一季第二集有一句很有意思的臺詞:游客William來到西部世界公園,遇到一個(gè)美女接待員,但...
    弗拉明哥閱讀 3,676評論 4 27
  • 這個(gè)分析卡殼了,主要是因?yàn)闆]有對電路中的門進(jìn)行編號,很容易把自己搞暈。于是,重新編號進(jìn)行分析,電路圖如下所示: 初...
    CodingTech閱讀 2,205評論 0 2
  • 古之 武夷山下 一芽三葉捧春夏 為避兵亂恐誤時(shí) 松燒煙留香反佳 今之 聞名天下 飛剪風(fēng)帆曾競發(fā) 鐘情拜倫長篇詩...
    珠江潮平閱讀 607評論 15 13
  • 其實(shí)無論你能傷害我有多深,只要你能從后面輕輕抱著我,那我愿意轉(zhuǎn)過身來緊緊抱住你,我就是這樣傻傻的愛著你!
    落在人間的傘閱讀 193評論 0 0
  • 請別浪費(fèi)每一次的快門, 所以盡量調(diào)好光,構(gòu)完圖,再按下快門。當(dāng)然有些時(shí)候需要連拍就別吝嗇了,特別是人像,抓拍的才會...
    JJ1178v閱讀 692評論 1 1

友情鏈接更多精彩內(nèi)容