LR(k)分析器实现

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')


# 有可能是转移或者根据语法规约
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]
                    # 新的输入是语法的左端,再取出新的状态
                    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()


©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 《WestWorld》第一季第二集有一句很有意思的台词:游客William来到西部世界公园,遇到一个美女接待员,但...
    弗拉明哥阅读 3,617评论 4 27
  • 这个分析卡壳了,主要是因为没有对电路中的门进行编号,很容易把自己搞晕。于是,重新编号进行分析,电路图如下所示: 初...
    CodingTech阅读 2,126评论 0 2
  • 古之 武夷山下 一芽三叶捧春夏 为避兵乱恐误时 松烧烟留香反佳 今之 闻名天下 飞剪风帆曾竞发 钟情拜伦长篇诗...
    珠江潮平阅读 566评论 15 13
  • 其实无论你能伤害我有多深,只要你能从后面轻轻抱着我,那我愿意转过身来紧紧抱住你,我就是这样傻傻的爱着你!
    落在人间的伞阅读 185评论 0 0
  • 请别浪费每一次的快门, 所以尽量调好光,构完图,再按下快门。当然有些时候需要连拍就别吝啬了,特别是人像,抓拍的才会...
    JJ1178v阅读 583评论 1 1