<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hant-TW">
	<id>https://wiki.taigi.ima.org.tw/w/index.php?action=history&amp;feed=atom&amp;title=LR%E5%88%86%E6%9E%90%E5%99%A8</id>
	<title>LR分析器 - 修訂紀錄</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.taigi.ima.org.tw/w/index.php?action=history&amp;feed=atom&amp;title=LR%E5%88%86%E6%9E%90%E5%99%A8"/>
	<link rel="alternate" type="text/html" href="https://wiki.taigi.ima.org.tw/w/index.php?title=LR%E5%88%86%E6%9E%90%E5%99%A8&amp;action=history"/>
	<updated>2026-04-22T03:44:13Z</updated>
	<subtitle>本 wiki 上此頁面的修訂紀錄</subtitle>
	<generator>MediaWiki 1.43.1</generator>
	<entry>
		<id>https://wiki.taigi.ima.org.tw/w/index.php?title=LR%E5%88%86%E6%9E%90%E5%99%A8&amp;diff=456053&amp;oldid=prev</id>
		<title>TaiwanTonguesApiRobot：​從 JSON 檔案批量匯入</title>
		<link rel="alternate" type="text/html" href="https://wiki.taigi.ima.org.tw/w/index.php?title=LR%E5%88%86%E6%9E%90%E5%99%A8&amp;diff=456053&amp;oldid=prev"/>
		<updated>2025-08-23T03:22:12Z</updated>

		<summary type="html">&lt;p&gt;從 JSON 檔案批量匯入&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新頁面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;#039;&amp;#039;&amp;#039;LR 分析器&amp;#039;&amp;#039;&amp;#039;是一種對下跤起去（bottom-up）的頂下文無關係語法的分析器。&amp;#039;&amp;#039;&amp;#039;LR&amp;#039;&amp;#039;&amp;#039;意指由左（&amp;#039;&amp;#039;&amp;#039;L&amp;#039;&amp;#039;&amp;#039;eft）至正處理輸入字串，並以上正爿優先衍生（&amp;#039;&amp;#039;&amp;#039;R&amp;#039;&amp;#039;&amp;#039;ight derivation）的推導順序（相對的是 LL 分析器）建構語法樹。會當用這个方式來解破的方法共號做&amp;#039;&amp;#039;&amp;#039;LR 語法&amp;#039;&amp;#039;&amp;#039;。啊若佇咧&amp;#039;&amp;#039;&amp;#039;LR ( k )&amp;#039;&amp;#039;&amp;#039;按呢的名中間，&amp;#039;&amp;#039;&amp;#039;k&amp;#039;&amp;#039;&amp;#039;代表的是剖析時間需要&amp;#039;&amp;#039;&amp;#039;前瞻符號&amp;#039;&amp;#039;&amp;#039;（lookahead symbol）的數量，也就是除了目前處理甲的輸入符號以外，著閣向正爿參照幾个符號的意思；省略&amp;#039;&amp;#039;&amp;#039;（k）&amp;#039;&amp;#039;&amp;#039;時即看為 LR ( 一 )，毋是 LR ( 零 )。&lt;br /&gt;
&lt;br /&gt;
因為 LR 分析器試由分析樹仔的葉節點開始，向頂頭一層透過文法規則的化簡，最後規約轉去樹仔的根部（先符號）， 所以伊是一種由下而上的分析方法。真濟程式語言使用 LR ( 一 ) 來講文法，所以足濟編譯器攏使用 LR 分析器分析原始碼的文法結構。LR 分析的優點如下：&lt;br /&gt;
&lt;br /&gt;
* 濟濟的程式語言攏會當用某種 LR 分析器（閣有變形）分析文法。（C + + 是一个出名的例外）&lt;br /&gt;
* LR 分析器會當真有效率的建置。&lt;br /&gt;
* 嘿所有「對左右爾」掃描原始碼的破析器來講，LR 分析器會當佇上短的時間內偵測著文法錯誤（這是指文法無法度描述的字串）。&lt;br /&gt;
&lt;br /&gt;
毋過 LR 分析器是誠歹做人工的方式設計，一般使用「分析產生器（parser generator）」 抑是「編譯器的編譯器（compiler-compiler，產生編譯器的工具）」 來建構伊。LR 分析器會當根據分析表（parsing table）的建構方式，分類「簡單 LR 分析器（SLR , Simple LR parser）」、「 前瞻 LR 分析器（LALR , Look-ahead LR parser）」 以及「正港的 LR 分析器 ( Canonical LR parser )」。 這解析器攏會當處理大量的文法規則，其中 LALR 分析器較 SLR 分析器強大，啊若正港 LR 分析器閣比 LALR 分析器能處理閣較濟的文法。出名的 Yacc 也就是用來產生 LALR 分析器的工具。&lt;br /&gt;
&lt;br /&gt;
==LR 分析器的結構==&lt;br /&gt;
&lt;br /&gt;
以表格為主（table-based）毋過因為上的分析器會當用圖一描述其結構，伊包括：&lt;br /&gt;
&lt;br /&gt;
* 輸入緩衝區，輸入的原始儉佇遮，分析會對頭一个符號開始依序向後掃描。&lt;br /&gt;
* 一个疊，儲存過去的狀態佮化簡中的符號。&lt;br /&gt;
* 一張 _ 狀態轉移表 _（goto table）， 決定狀態的移轉規則。&lt;br /&gt;
* 一張 _ 動作表 _（action table）， 決定目前的狀態拄著輸入符號的時應採取的文法規則，輸入符號指的是終端符號（Terminals）佮非終端符號的（Non-terminals）。&lt;br /&gt;
&lt;br /&gt;
===分析演算法===&lt;br /&gt;
&lt;br /&gt;
LR 分析過程如下：&lt;br /&gt;
&lt;br /&gt;
一 . 共結尾字元 $ 佮起始狀態零依序壓入空堆疊，了後的狀態佮符號會予人壓入疊著的頂懸。&lt;br /&gt;
二 . 根據目前的狀態佮輸入的終端符號，去動作表內底揣著對應動作：&lt;br /&gt;
* 徙位（shift）s _ n _ :&lt;br /&gt;
* 共目前的終端符號由輸入緩衝區內底移出閣壓入疊&lt;br /&gt;
* 才將狀態 _ n _ 壓入疊出來閣成做上新的狀態&lt;br /&gt;
* 化簡（reduce）r _ m _ :&lt;br /&gt;
* 考慮第 m 條文法規則，假使講文法的 _ 正爿（right-hand side）_ 有 X 個符號，則將二 X 個元素對疊著彈出&lt;br /&gt;
* 這个時陣過去的某一个狀態會轉來疊頂懸&lt;br /&gt;
* 佇咧 _ 狀態轉移表 _ 走揣這个狀態拄著文法 _ 倒爿（left-hand side）_ 彼號符號的狀態轉移&lt;br /&gt;
* 共文法倒手爿的符號壓入疊&lt;br /&gt;
* 將走揣著新的狀態壓入疊著&lt;br /&gt;
* 接受，輸入字串解析完成。&lt;br /&gt;
* 無對應動作，此情形就算是文法錯誤。&lt;br /&gt;
三 . 重複步數二直到輸入的字串被接受或者是偵測著文法錯誤。&lt;br /&gt;
&lt;br /&gt;
===範例===&lt;br /&gt;
&lt;br /&gt;
考慮以下文法：&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
: ( 一 ) E → E \ * B&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
: ( 二 ) E → E + B&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
: ( 三 ) E → B&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
: ( 四 ) B → 零&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
: ( 五 ) B → 待剖析的輸入字串是：&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&amp;#039;&amp;#039;&amp;#039;一 + 一&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
====動作表佮狀態轉移表====&lt;br /&gt;
&lt;br /&gt;
LR ( 零 ) 分析器使用的格如下：&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;動作表&amp;#039;&amp;#039;&amp;#039;用表示目前狀態拄著 _ 終端符號 _（包含結尾字元 $）的對應動作，欄位內底可能有三種動作：&lt;br /&gt;
&lt;br /&gt;
* _ 徙位 _，記為&amp;#039;shift&amp;#039;&amp;#039;n&amp;#039;，表示後一个狀態是 _ n _&lt;br /&gt;
* _ 化簡 _，記為&amp;#039;reduce&amp;#039;&amp;#039;m&amp;#039;，表示使用第 _ m _ 條文法規則化簡堆疊中的內容。&lt;br /&gt;
* _ 接受 _，記為&amp;#039;accept&amp;#039;，表示破析正確的完成，輸入的字串予文法所定義的語言接受 ・&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;狀態轉移表&amp;#039;&amp;#039;&amp;#039;用表示簡化了後的狀態拄著 _ 非終端符號 _ 時的轉移規則。&lt;br /&gt;
&lt;br /&gt;
====分析過程====&lt;br /&gt;
&lt;br /&gt;
下表是分析過程中的各部份，疊的頂頭佇上正爿，狀態的轉移佮規堆的化簡單攏以上表為依據，猶閣特殊字元&amp;#039;$&amp;#039;嘛加到輸入攕的尾溜表示結尾。&lt;br /&gt;
&lt;br /&gt;
====範例說明====&lt;br /&gt;
&lt;br /&gt;
分析起頭的時陣疊會包含元素 $ 和零：&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
: [&amp;#039;&amp;#039;&amp;#039;$&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;零&amp;#039;&amp;#039;&amp;#039;]&lt;br /&gt;
&lt;br /&gt;
分析器頭先對輸入緩衝區看著符號&amp;#039;一&amp;#039;，根據 _ 動作表 _ 做狀態&amp;#039;&amp;#039;&amp;#039;零&amp;#039;&amp;#039;&amp;#039;拄著終端符號&amp;#039;一&amp;#039;的時陣用徙位動作&amp;#039;&amp;#039;&amp;#039;s 二&amp;#039;&amp;#039;&amp;#039;，即是將&amp;#039;一&amp;#039;對輸入緩衝區內底移出閣推入堆疊，閣將新的狀態&amp;#039;&amp;#039;&amp;#039;二&amp;#039;&amp;#039;&amp;#039;嘛疊起來，這个時陣疊起來變：&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
: [&amp;#039;&amp;#039;&amp;#039;$&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;零&amp;#039;&amp;#039;&amp;#039;&amp;#039;一&amp;#039;&amp;#039;&amp;#039;&amp;#039;二&amp;#039;&amp;#039;&amp;#039;]&lt;br /&gt;
&lt;br /&gt;
（ 為著避免終端符號佮狀態濫份，故堆疊著的終端符號攏加上單引號區別）&lt;br /&gt;
&lt;br /&gt;
來看著的終端符號是&amp;#039;+&amp;#039;，根據&amp;#039;&amp;#039;&amp;#039;動作表&amp;#039;&amp;#039;&amp;#039;無論狀態&amp;#039;&amp;#039;&amp;#039;二&amp;#039;&amp;#039;&amp;#039;拄著任何終端符號，攏執行&amp;#039;&amp;#039;&amp;#039;r 五&amp;#039;&amp;#039;&amp;#039;動作（以第五條文法規則&amp;#039;&amp;#039;&amp;#039;B → 一&amp;#039;&amp;#039;&amp;#039;化簡堆疊內容）。 此化簡的動作表示破析器已經佇堆疊中認出第五條文法規則的&amp;#039;&amp;#039;&amp;#039;正手爿&amp;#039;&amp;#039;&amp;#039;部份，所以會當用這个規則的&amp;#039;&amp;#039;&amp;#039;倒手爿&amp;#039;&amp;#039;&amp;#039;符號 _ B _ 取代。因為乎&amp;#039;&amp;#039;&amp;#039;第五條文法的正爿有一个符號&amp;#039;&amp;#039;&amp;#039;，因此阮&amp;#039;&amp;#039;&amp;#039;共兩个元素（一 × 二=二）自堆疊彈出&amp;#039;&amp;#039;&amp;#039;，現此時會轉來狀態&amp;#039;&amp;#039;&amp;#039;零&amp;#039;&amp;#039;&amp;#039;，閣推入去符號 _ B _，並&amp;#039;&amp;#039;&amp;#039;走揣轉移表中狀態零拄著非終端符號 _ B _ 後的新的狀態&amp;#039;&amp;#039;&amp;#039;。新的狀態是&amp;#039;&amp;#039;&amp;#039;四&amp;#039;&amp;#039;&amp;#039;，完成這步數了後的疊起來是：&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
: [&amp;#039;&amp;#039;&amp;#039;$&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;零&amp;#039;&amp;#039;&amp;#039;_ B _&amp;#039;&amp;#039;&amp;#039;四&amp;#039;&amp;#039;&amp;#039;]&lt;br /&gt;
&lt;br /&gt;
因為頂一个總端符號&amp;#039;+&amp;#039;閣猶未予人處理，所以猶原保留佇輸入緩衝區內底。依據&amp;#039;&amp;#039;&amp;#039;動作表&amp;#039;&amp;#039;&amp;#039;，咧狀態&amp;#039;&amp;#039;&amp;#039;四&amp;#039;&amp;#039;&amp;#039;拄著&amp;#039;+&amp;#039;時做&amp;#039;&amp;#039;&amp;#039;r 三&amp;#039;&amp;#039;&amp;#039;化簡。根據第三條文法&amp;#039;&amp;#039;&amp;#039;E → B&amp;#039;&amp;#039;&amp;#039;，阮共&amp;#039;&amp;#039;&amp;#039;四&amp;#039;&amp;#039;&amp;#039;佮 _ B _ 從堆疊彈出，轉去狀態&amp;#039;&amp;#039;&amp;#039;零&amp;#039;&amp;#039;&amp;#039;。來壓入去 _ E _，根據&amp;#039;&amp;#039;&amp;#039;狀態轉移表&amp;#039;&amp;#039;&amp;#039;，做狀態&amp;#039;&amp;#039;&amp;#039;零&amp;#039;&amp;#039;&amp;#039;拄著非終端符號 _ E _ 愛轉移到狀態&amp;#039;&amp;#039;&amp;#039;三&amp;#039;&amp;#039;&amp;#039;，因此將&amp;#039;&amp;#039;&amp;#039;三&amp;#039;&amp;#039;&amp;#039;壓入疊：&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
: [&amp;#039;&amp;#039;&amp;#039;$&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;零&amp;#039;&amp;#039;&amp;#039;_ E _&amp;#039;&amp;#039;&amp;#039;三&amp;#039;&amp;#039;&amp;#039;]&lt;br /&gt;
&lt;br /&gt;
繼續猶未處理的符號&amp;#039;+&amp;#039;，做狀態&amp;#039;&amp;#039;&amp;#039;三&amp;#039;&amp;#039;&amp;#039;遇著&amp;#039;+&amp;#039;時陣的對應動作是&amp;#039;&amp;#039;&amp;#039;s 六&amp;#039;&amp;#039;&amp;#039;，將&amp;#039;+&amp;#039;對輸入中移出閣壓入疊，閣將新的狀態六嘛壓入疊：&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
: [&amp;#039;&amp;#039;&amp;#039;$&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;零&amp;#039;&amp;#039;&amp;#039;_ E _&amp;#039;&amp;#039;&amp;#039;三&amp;#039;&amp;#039;&amp;#039;&amp;#039;+&amp;#039;&amp;#039;&amp;#039;&amp;#039;六&amp;#039;&amp;#039;&amp;#039;]&lt;br /&gt;
&lt;br /&gt;
後一个符號是&amp;#039;一&amp;#039;，咧狀態&amp;#039;&amp;#039;&amp;#039;六&amp;#039;&amp;#039;&amp;#039;看著&amp;#039;一&amp;#039;時的動作是&amp;#039;&amp;#039;&amp;#039;s 二&amp;#039;&amp;#039;&amp;#039;，將&amp;#039;一&amp;#039;對輸入中移出閣壓入疊，閣將新的狀態二嘛壓入相疊：&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
: [&amp;#039;&amp;#039;&amp;#039;$&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;零&amp;#039;&amp;#039;&amp;#039;E&amp;#039;&amp;#039;&amp;#039;三&amp;#039;&amp;#039;&amp;#039;&amp;#039;+&amp;#039;&amp;#039;&amp;#039;&amp;#039;六&amp;#039;&amp;#039;&amp;#039;&amp;#039;一&amp;#039;&amp;#039;&amp;#039;&amp;#039;二&amp;#039;&amp;#039;&amp;#039;]&lt;br /&gt;
&lt;br /&gt;
最後看著的輸入符號是 $，狀態二拄著 $ 時的動作是&amp;#039;&amp;#039;&amp;#039;r 五&amp;#039;&amp;#039;&amp;#039;，以第五條文法規則化簡堆疊內容。此化簡動作佮第二步仝款，疊彈出兩个元素了後轉來狀態&amp;#039;&amp;#039;&amp;#039;六&amp;#039;&amp;#039;&amp;#039;，這當陣閣壓入符號 _ B _ 了後會進入狀態&amp;#039;&amp;#039;&amp;#039;八&amp;#039;&amp;#039;&amp;#039;（根據狀態轉移表）， 因此嘛共八壓入疊起來：&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
: [&amp;#039;&amp;#039;&amp;#039;$&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;零&amp;#039;&amp;#039;&amp;#039;E&amp;#039;&amp;#039;&amp;#039;三&amp;#039;&amp;#039;&amp;#039;&amp;#039;+&amp;#039;&amp;#039;&amp;#039;&amp;#039;六&amp;#039;&amp;#039;&amp;#039;B&amp;#039;&amp;#039;&amp;#039;八&amp;#039;&amp;#039;&amp;#039;]&lt;br /&gt;
&lt;br /&gt;
咧狀態&amp;#039;&amp;#039;&amp;#039;八&amp;#039;&amp;#039;&amp;#039;看著符號 $ 時間分析器會繼續化簡，根據&amp;#039;&amp;#039;&amp;#039;動作表&amp;#039;&amp;#039;&amp;#039;執行&amp;#039;&amp;#039;&amp;#039;r 二&amp;#039;&amp;#039;&amp;#039;化簡動作，採用第二條文法規則&amp;#039;&amp;#039;&amp;#039;E → E + B&amp;#039;&amp;#039;&amp;#039;簡化疊。因為這个規則的正手爿有三个符號，故從堆疊中彈出六个元素。這陣轉來狀態&amp;#039;&amp;#039;&amp;#039;零&amp;#039;&amp;#039;&amp;#039;，將規則倒爿的符號 _ E _ 疊起來了後，進入新的狀態&amp;#039;&amp;#039;&amp;#039;三&amp;#039;&amp;#039;&amp;#039;（根據狀態轉移表）， 共壓入後疊做：&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
: [&amp;#039;&amp;#039;&amp;#039;$&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;零&amp;#039;&amp;#039;&amp;#039;E&amp;#039;&amp;#039;&amp;#039;三&amp;#039;&amp;#039;&amp;#039;]&lt;br /&gt;
&lt;br /&gt;
落尾咧狀態三看著符號 $，對應的動作是 acc，表示分析順利完成。&lt;br /&gt;
&lt;br /&gt;
==建構 LR ( 零 ) 分析表==&lt;br /&gt;
&lt;br /&gt;
===LR ( 零 ) 項目（Items）===&lt;br /&gt;
&lt;br /&gt;
建構破析表的過程愛使用 _ LR ( 零 ) 項目 _（以下簡稱做「項目」）， 這是&amp;#039;&amp;#039;&amp;#039;項目&amp;#039;&amp;#039;&amp;#039;是佇文法規則的正手爿插入一个特殊的符號「・」所產生。比如講文法 _ E → E + B _ 有下列四个對應的項目：&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
: _ E →·E + B _&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
: _ E → E·+ B _&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
: _ E → E +·B _&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
: _ E → E + B·_&lt;br /&gt;
&lt;br /&gt;
若文法規則的形式是 _ A → ε _，則對應的唯一項目是：&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
: _ A →·_&lt;br /&gt;
&lt;br /&gt;
建立項目的用意是愛決定破析器的狀態，比如講 _ E → E·+ B _ 的意義是講「分析器已經佇輸入的符號內底認出 _ E _ 的部份，目前當等咧看著一个&amp;#039;+&amp;#039;符號佮接續的 _ B _ 的部份」。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===項目集合===&lt;br /&gt;
&lt;br /&gt;
佇咧一般的情形內底，分析器袂當預知未來欲用佗一條文法規則來化簡堆疊內容，所以足歹講單一个項目決定狀態。比如講以下文法：&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
: _ E → E + B _&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
: _ E → E \ * B _&lt;br /&gt;
&lt;br /&gt;
當剖析器認出疊中的 _ E _ 部份的時陣，伊無法度去預測未來繼續看著&amp;#039;+&amp;#039;抑是&amp;#039;\ *&amp;#039;，所以這陣的狀態愛用兩个項目表示：&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
: _ E → E·+ B _&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
: _ E → E·\ * B _&lt;br /&gt;
&lt;br /&gt;
故咱用項目的集合 { _ E → E·+ B _ , _ E → E·\ * B _ } 來表示「分析器認出 _ E _ 並期待 _ + B _ 抑是 _ \ * B _」的狀態。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===項目集合的封閉集===&lt;br /&gt;
&lt;br /&gt;
如前段講，破析器總是期待佇後壁面輸入中看著項目中的&amp;#039;・&amp;#039;了後的符號。若是&amp;#039;・&amp;#039;了後的符號是&amp;#039;&amp;#039;&amp;#039;非終端符號&amp;#039;&amp;#039;&amp;#039;，應該愛加入這个符號所推演出的文法規則，按呢才會當正確來講狀態。譬如講規則：&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
: _ E → E + B _&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
: _ B → 零 _&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
: _ B → 一 _&lt;br /&gt;
&lt;br /&gt;
當咱來到狀態 _ E → E +·B _ 時，分析器期待看著非終端符號 _ B _，而且 _ B _ 閣會當推演為終端符號 _ 零 _ 佮 _ 一 _。所以這个時陣的狀態應表示：&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
: _ E → E +·B _&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
: _ B →·零 _&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
: _ B →·一 _&lt;br /&gt;
&lt;br /&gt;
即是「已經認出來 _ E + _ 部份，目前期待看著 _ B _，而且 _ B _ 也就是講&amp;#039;零&amp;#039;佮&amp;#039;一&amp;#039;」之意。現象會當共伊講：&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
: 若項目集合中&amp;#039;&amp;#039;&amp;#039;包含 _ A → x·By _ 形式&amp;#039;&amp;#039;&amp;#039;的項目，其中&amp;#039;&amp;#039;&amp;#039;_ B _ 為非終端符號&amp;#039;&amp;#039;&amp;#039;，則對所有的文法規則 _ B → w _ 來講，_ B →·w _ 嘛會予人加入項目集合內底。&lt;br /&gt;
&lt;br /&gt;
逐个項目集合攏應該按呢規則擴充，共藏佇的項目加到集合內底&amp;#039;&amp;#039;&amp;#039;一直到所有咧 ・ 了後的非終端符號攏處理過&amp;#039;&amp;#039;&amp;#039;。遮爾所產生的新集合&amp;#039;&amp;#039;&amp;#039;講這个項目集合的「封閉集」&amp;#039;&amp;#039;&amp;#039;，符號的表示為&amp;#039;&amp;#039;&amp;#039;closure ( _ I _ )&amp;#039;&amp;#039;&amp;#039;，其中 _ I _ 表示原項目集合。分析過程中的各種狀態也就是由遮的封閉集所構成。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===擴充文法===&lt;br /&gt;
&lt;br /&gt;
咧決定狀態中間的轉移前，咱著愛先加入一條擴充文法：&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
: ( 零 ) _ S → E _&lt;br /&gt;
&lt;br /&gt;
其中 _ S _ 是新的起頭符號（start symbol）而且 _ E _ 是原先的起頭符號。這做法是為著使破析器能有一个唯一的起始狀態，譬如講考慮以下文法：&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
: ( 一 ) _E → E \ * B _&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
: ( 二 ) _ E → E + B _&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
: ( 三 ) _ E → B _&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
: ( 四 ) _ B → 零 _&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
: ( 五 ) _ B → 一 _&lt;br /&gt;
&lt;br /&gt;
有三條規則對起始符號開始，分析器不得不選擇一條作為起始狀態。加入擴充文法了後，咱使用下列規則來決定項目集合佮狀態：&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&amp;#039;&amp;#039;&amp;#039;（零）_ S → E _&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
: ( 一 ) _ E → E \ * B _&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
: ( 二 ) _ E → E + B _&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
: ( 三 ) _ E → B _&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
: ( 四 ) _ B → 零 _&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
: ( 五 ) _ B → 一 _&lt;br /&gt;
&lt;br /&gt;
可見起先狀態唯一確定。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===走揣會當到的集合佮之間的轉移===&lt;br /&gt;
&lt;br /&gt;
建構破析表的頭一步是揣出封閉集合之間的轉移。封閉集會當看做是自動機中的狀態，若狀態間的轉移是由終端符號佮非終端符號決定。起先的狀態是由擴充的第零條文法規則對應的項目所形成的封閉集：&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&amp;#039;&amp;#039;&amp;#039;Item set 零&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
: _ S →·E _&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
: _ E →·E \ * B _&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
: _ E →·E + B _&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
: _ E →·B _&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
: _ B →·零 _&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
: _ B →·一 _&lt;br /&gt;
&lt;br /&gt;
集合內底的頭一个項目是該集合的核心，透過集合的封閉規則，咱加入其他的項目補足集合使其實封閉。這組封閉集合是頭一个狀態（I 零）， 這馬咱欲揣出這組狀態可能的轉移情形。&lt;br /&gt;
&lt;br /&gt;
==參考資料==&lt;br /&gt;
&lt;br /&gt;
* _ Compilers : Principles , Techniques , and Tools _ , Aho，Sethi，Ullman，Addison-Wesley，一千九百八十六 . ISBN 空九二百空一四一曝空八十八分六&lt;br /&gt;
* Internals of an LALR ( 一 ) parser generated by GNU Bison&lt;br /&gt;
&lt;br /&gt;
[[分類: 待校正]]&lt;/div&gt;</summary>
		<author><name>TaiwanTonguesApiRobot</name></author>
	</entry>
</feed>