[Theory] Parsing Techniques 讀書筆記(六):確定性自底向上解析

9. Deterministic Bottom-Up Parsing

名詞定義

handle:別識(shí)別出的字符串片段(segment)菲盾,和產(chǎn)生是規(guī)則(production rule)颓影。

操作符文法(operator grammar):是一種上下文無關(guān)文法,每條產(chǎn)生式的右邊至少包含一個(gè)終結(jié)符或一個(gè)非終結(jié)符懒鉴,并且右邊的任意兩個(gè)非終結(jié)符都不相連诡挂。操作符文法中的終結(jié)符,稱為操作符(operator)临谱。

有界上下文文法(bounded-context grammar):對(duì)歸約進(jìn)行了上下文限制璃俗,產(chǎn)生式 A -> α 的右邊 α,只有當(dāng)出現(xiàn)在合適的上下文 β_1 α β_2 中時(shí)悉默,才會(huì)被歸約為 A城豁。其中 β_1 稱為左上下文,β_2 稱為右上下文抄课,它們都是有限長(zhǎng)度的唱星,分別為 m,n跟磨。如果對(duì)于任意的 α魏颓,存在唯一確定的上下文 β_1 α β_2,就稱該文法為有界上下文文法吱晒,記為 BC(m,n)甸饱。

右界上下文文法(bounded-right context grammar):如果有界上下文文法中的右邊界(right context)只包含終結(jié)符,該文法就稱為右界上下文文法,記為 BRC(m,n)叹话。

station:handle查找自動(dòng)機(jī)(handle-?nding automata)的一種狀態(tài)偷遗,它表示只有通過ε 字符轉(zhuǎn)入的邊,沒有跳轉(zhuǎn)出去的邊驼壶。

不充分狀態(tài)(inadequate state):確定性自動(dòng)機(jī)中的氏豌,包含歧義的狀態(tài)。
LR(0)文法:可以構(gòu)造一個(gè)不含歧義狀態(tài)LR(0)自動(dòng)機(jī)的文法热凹,稱為L(zhǎng)R(0)文法泵喘。
LR(1)文法:通過前瞻一個(gè)字符,可以得到一個(gè)不含歧義的LR(1)自動(dòng)機(jī)般妙,這樣的文法稱為L(zhǎng)R(1)文法纪铺。

item look-ahead:當(dāng)前推導(dǎo)后面可以跟的字符串的集。
dot look-ahead:當(dāng)前解析位置碟渺,后面可以跟的字符串集鲜锚。

LALR(1)文法:帶前瞻特性的LR(0)解析器(Look Ahead LR(0) with a look-ahead of 1 token)
LA(k)LR(j)文法:LA(k)表示右上下文(前瞻),LR(j)表示左上下文(狀態(tài)機(jī))苫拍。LALR(1)實(shí)際上是LA(1)LR(0)芜繁,LALR(k)是LA(k)LR(0)。

內(nèi)容總結(jié)

確定性自底向上解析器的主要任務(wù)是尋找handle绒极,一定handle確定下來骏令,解析方法也就確定下來了。
對(duì)自底向上解析來說垄提,語義動(dòng)作(semantic actions)在的歸約(reduction)時(shí)觸發(fā)的榔袋,在產(chǎn)生式被確定的那一刻。

優(yōu)先級(jí)解析(precedence parsing)的關(guān)鍵在于確定優(yōu)先級(jí)關(guān)系(precedence relation)塔淤,或優(yōu)先級(jí)表(precedence table)。

操作符文法中的優(yōu)先級(jí)關(guān)系速妖,也可以用優(yōu)先級(jí)函數(shù)(precedence function)來表示高蜂,占用更少的空間。

LR解析器的重要部分是一個(gè)狀態(tài)機(jī)(handle-?nding automata)罕容,它可以由任意的上下文無關(guān)文法構(gòu)造出來备恤,它表示任意的非終結(jié)符接受任意字符會(huì)跳轉(zhuǎn)到哪個(gè)狀態(tài)(包括ε 字符)。
狀態(tài)機(jī)的狀態(tài)數(shù)锦秒,與語法中的非終結(jié)符數(shù)目成正比露泊。
根據(jù)文法,我們可以先得到一個(gè)非確定性狀態(tài)機(jī)旅择,然后通過子集構(gòu)造法(subset construction)惭笑,轉(zhuǎn)換成確定性自動(dòng)機(jī)。

借助確定性狀態(tài)機(jī),可以得到LR(0)解析算法沉噩。
(1)如果當(dāng)前狀態(tài)不是接受狀態(tài)捺宗,則讀取下一個(gè)字符。
(2)如果是接受狀態(tài)川蒙,則從彈出一個(gè)狀態(tài)蚜厉,以及相應(yīng)長(zhǎng)度的輸入字符串,進(jìn)行一次歸約畜眨,再把歸約后的非終結(jié)符壓棧昼牛。

確定性狀態(tài)機(jī)的行為,經(jīng)常表示成兩個(gè)表ACTION和GOTO康聂,ACTION表示歸約或移入字符贰健,GOTO表示當(dāng)前狀態(tài)接受字符后跳轉(zhuǎn)到哪個(gè)狀態(tài)。
LR(0)根據(jù)當(dāng)前字符的所有左上下文早抠,來判斷歸約方式霎烙,相當(dāng)于具有無窮長(zhǎng)左邊界的右界上下文文法 BRC(∞,0)。

LR(0)對(duì)應(yīng)的確定性自動(dòng)機(jī)的接受狀態(tài)可能是有歧義的蕊连,包括兩種:shift/reduce歧義性(shift還是reduce都可行)悬垃,reduce/reduce歧義性(兩種reduce方式)。

包含空串規(guī)則(ε-rules)的文法不是LR(0)的甘苍,解決方法可以采用動(dòng)態(tài)解析(dynamically parse)檢查當(dāng)前的狀態(tài)棧尝蠕。

由于LR(0)的要求比較嚴(yán)格,所以只有很少的文法是LR(0)的载庭。
因此看彼,可以加入前瞻機(jī)制,來提升解析器的能力囚聚,通過前瞻一個(gè)字符得到解析器稱為L(zhǎng)R(1)解析器靖榕。
LR(1)自動(dòng)機(jī),也可以表示為兩個(gè)表ACTION和GOTO顽铸。
LR(1)解析器有足夠的能力處理空串規(guī)則(ε-rules)茁计。

LR(k>1)不是簡(jiǎn)單的LR(1)擴(kuò)展,需要引入兩種前瞻:item look-ahead 和 dot look-ahead谓松。
對(duì)于LR(1)而言星压,dot look-ahead 與 item look-ahead 是同一個(gè)集合。

LR(k)文法的性質(zhì):
(1)LR(k>1)鬼譬,總是轉(zhuǎn)換為L(zhǎng)R(k-1)娜膘,但是LR(1)卻不總是能轉(zhuǎn)換成LR(0)。
(2)下推自動(dòng)機(jī)可解析的語言优质,是LR(1)的竣贪,也稱為確定性語言(deterministic languages)军洼。
(3)任何用確定性方法可解析的語言,都是LR(1)的贾富。
(4)LR(k)是目前能力最強(qiáng)大的解析器歉眷。

LR(1)的缺點(diǎn)是,占用了太多了內(nèi)存空間颤枪。
一個(gè)簡(jiǎn)單的文法對(duì)應(yīng)的自動(dòng)機(jī)汗捡,可能會(huì)包含成千上萬個(gè)狀態(tài)。
LALR(1)是LR(0)自動(dòng)機(jī)和前瞻方法的合并畏纲,狀態(tài)數(shù)與LR(0)一樣扇住。

構(gòu)建LALR(1)解析表的通常方法是,先構(gòu)造LR(1)解析表盗胀,然后再進(jìn)行狀態(tài)合并艘蹋,這個(gè)方法比較繁瑣。
另外還有一些常見的解析表構(gòu)造方法:
(1)一個(gè)簡(jiǎn)單的算法:在構(gòu)造解析表的時(shí)候票灰,避免重復(fù)的狀態(tài)
(2)yacc使用的channel算法
(3)relations算法:對(duì)LR(0)狀態(tài)機(jī)進(jìn)行調(diào)整女阀,找到不充分的狀態(tài)(inadequate state)消除歧義。具體處理方法比較復(fù)雜:包括lookback relation和includes relation屑迂。
(4)通過文法變化浸策,把LALR(1)轉(zhuǎn)換成SLR(1)。

SLR(1)解析器的能力介于LR(0)和LALR(1)之間惹盼,但是SLR(1)解析器的大小卻跟LALR(1)差不多庸汗。所以,LALR(1)更常見手报。


參考

Parsing Techniques

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蚯舱,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子掩蛤,更是在濱河造成了極大的恐慌枉昏,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,692評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件揍鸟,死亡現(xiàn)場(chǎng)離奇詭異兄裂,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)蜈亩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門懦窘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來前翎,“玉大人稚配,你說我怎么就攤上這事「刍” “怎么了道川?”我有些...
    開封第一講書人閱讀 162,995評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我冒萄,道長(zhǎng)臊岸,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,223評(píng)論 1 292
  • 正文 為了忘掉前任尊流,我火速辦了婚禮帅戒,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘崖技。我一直安慰自己逻住,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,245評(píng)論 6 388
  • 文/花漫 我一把揭開白布迎献。 她就那樣靜靜地躺著瞎访,像睡著了一般。 火紅的嫁衣襯著肌膚如雪吁恍。 梳的紋絲不亂的頭發(fā)上扒秸,一...
    開封第一講書人閱讀 51,208評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音冀瓦,去河邊找鬼伴奥。 笑死,一個(gè)胖子當(dāng)著我的面吹牛咕幻,可吹牛的內(nèi)容都是我干的渔伯。 我是一名探鬼主播,決...
    沈念sama閱讀 40,091評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼肄程,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼锣吼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蓝厌,我...
    開封第一講書人閱讀 38,929評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤玄叠,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后拓提,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體读恃,經(jīng)...
    沈念sama閱讀 45,346評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,570評(píng)論 2 333
  • 正文 我和宋清朗相戀三年代态,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了寺惫。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,739評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蹦疑,死狀恐怖西雀,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情歉摧,我是刑警寧澤艇肴,帶...
    沈念sama閱讀 35,437評(píng)論 5 344
  • 正文 年R本政府宣布腔呜,位于F島的核電站,受9級(jí)特大地震影響再悼,放射性物質(zhì)發(fā)生泄漏核畴。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,037評(píng)論 3 326
  • 文/蒙蒙 一冲九、第九天 我趴在偏房一處隱蔽的房頂上張望谤草。 院中可真熱鬧,春花似錦莺奸、人聲如沸咖刃。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽嚎杨。三九已至,卻和暖如春氧腰,著一層夾襖步出監(jiān)牢的瞬間枫浙,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工古拴, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留箩帚,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,760評(píng)論 2 369
  • 正文 我出身青樓黄痪,卻偏偏與公主長(zhǎng)得像紧帕,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子桅打,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,647評(píng)論 2 354

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