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)系作者
  • 序言:七十年代末阴挣,一起剝皮案震驚了整個(gè)濱河市赚瘦,隨后出現(xiàn)的幾起案子宗雇,更是在濱河造成了極大的恐慌蟆炊,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異灰殴,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)掰邢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進(jìn)店門牺陶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人辣之,你說我怎么就攤上這事掰伸。” “怎么了怀估?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵狮鸭,是天一觀的道長合搅。 經(jīng)常有香客問我,道長怕篷,這世上最難降的妖魔是什么历筝? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮廊谓,結(jié)果婚禮上梳猪,老公的妹妹穿的比我還像新娘。我一直安慰自己蒸痹,他們只是感情好春弥,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著叠荠,像睡著了一般匿沛。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上榛鼎,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天逃呼,我揣著相機(jī)與錄音,去河邊找鬼者娱。 笑死抡笼,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的黄鳍。 我是一名探鬼主播推姻,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼框沟!你這毒婦竟也來了藏古?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤忍燥,失蹤者是張志新(化名)和其女友劉穎拧晕,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體梅垄,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡厂捞,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了哎甲。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,977評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡饲嗽,死狀恐怖炭玫,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情貌虾,我是刑警寧澤吞加,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響衔憨,放射性物質(zhì)發(fā)生泄漏叶圃。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一践图、第九天 我趴在偏房一處隱蔽的房頂上張望掺冠。 院中可真熱鬧,春花似錦码党、人聲如沸德崭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽眉厨。三九已至,卻和暖如春兽狭,著一層夾襖步出監(jiān)牢的瞬間憾股,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工箕慧, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留服球,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓销钝,卻偏偏與公主長得像有咨,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子蒸健,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評論 2 355

推薦閱讀更多精彩內(nèi)容

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