文法と言語 ー文脈自由文法とLR構文解析ー

Slides:



Advertisements
Similar presentations
プログラミング言語論 プログラミング言語の構 文 水野嘉明. 目次 1. プログラミング言語の構文 2. BNF 3. 文脈自由文法 4. 構文図式 2.
Advertisements

プログラミング言語論 第3回 BNF 記法について(演習付き) 篠埜 功. 構文の記述 プログラミング言語の構文はどのように定式化できるか? 例1 : for ループの中に for ループが書ける。 for (i=0; i
システムソフトウェア 第3回:2007年10月17日(水)   . 2 本日学ぶこと 文法  文字と文字列  無限集合  文法とそのクラス  オートマトン.
和田俊和 資料保存場所 /2/26 文法と言語 ー正規表現とオートマトンー 和田俊和 資料保存場所
プログラミング言語論 第10回(演習) 情報工学科 木村昌臣   篠埜 功.
文法と言語 ー字句解析とオートマトンlexー
Problem by D. Mikurube Slides by Y. Izumi
言語処理系(7) 金子敬一.
コンパイラ 2011年10月17日
言語処理系(4) 金子敬一.
言語体系とコンピュータ 第6回.
言語処理系(6) 金子敬一.
5.チューリングマシンと計算.
5.チューリングマシンと計算.
文法と言語 ー文脈自由文法とLR構文解析2ー
文法と言語 ー文脈自由文法とLL構文解析ー
プログラミング言語論 第4回 式の構文、式の評価
計算の理論 II 文脈自由文法と プッシュダウンオートマトン
言語処理系(5) 金子敬一.
言語処理系(8) 金子敬一.
コンパイラ 2012年10月15日
コンパイラ 2012年10月22日
コンパイラ 2011年10月24日
システムソフトウェア講義の概要 計算機システムの復習:中央演算処理装置(CPU),プログラムの実行,主記憶装置,補助記憶装置
コンパイラ 第14回 上昇型構文解析(2) 38号館4階N-411 内線5459
プログラミング言語論 第3回 BNF記法について(演習付き)
正則言語 2011/6/27.
文法と言語 ー字句解析とオートマトンlexー
文法と言語 ー字句解析とオートマトンlexー
形式言語の理論 5. 文脈依存言語.
東京工科大学 コンピュータサイエンス学部 亀田弘之
コンパイラ 第13回 上昇型構文解析(1) 38号館4階N-411 内線5459
言語と文法 言語とは,ルールに従う記号列の無限集合である. 文法を与えることで言語が定義できる.
文法と言語 ー文脈自由文法とLR構文解析2ー
言語プロセッサ ー第9回目ー 構文解析(続き).
平成20年10月5日(月) 東京工科大学 コンピュータサイエンス学部 亀田弘之
文法と言語 ー文脈自由文法とLR構文解析3ー
計算の理論 II 前期の復習 -有限オートマトン-
東京工科大学 コンピュータサイエンス学部 亀田弘之
東京工科大学 コンピュータサイエンス学部 亀田弘之
2007年度 情報数理学.
プログラミング言語論 第9回 情報工学科 木村昌臣 篠埜 功.
文法と言語 ー文脈自由文法とLL構文解析ー
コンパイラ 2011年10月20日
平成26年4月22日(火) 東京工科大学 コンピュータサイエンス学部 亀田弘之
計算の理論 I 決定性有限オートマトン(DFA) と 非決定性有限オートマトン(NFA)
東京工科大学 コンピュータサイエンス学部 亀田弘之
計算の理論 I 非決定性有限オートマトン(NFA)
計算の理論 I -数学的概念と記法- 火曜 12:50~14:20 大月 美佳 2004年4月20日.
5.チューリングマシンと計算.
計算の理論 I -プッシュダウンオートマトン-
計算の理論 I プッシュダウンオートマトン 火曜3校時 大月 美佳 平成16年7月6日 佐賀大学知能情報システム学科.
計算の理論 I -数学的概念と記法- 月曜3校時 大月 美佳.
文法と言語 ー字句解析とオートマトンlexー
東京工科大学 コンピュータサイエンス学部 亀田 弘之
4.プッシュダウンオートマトンと 文脈自由文法の等価性
情報処理Ⅱ 2005年10月28日(金).
システムソフトウェア講義の概要 計算機システムの復習:中央演算処理装置(CPU),プログラムの実行,主記憶装置,補助記憶装置
コンパイラ 2012年10月11日
言語プロセッサ ー第9回目ー 構文解析(続き).
言語プロセッサ ー第7回目ー 構文解析(続き).
東京工科大学 コンピュータサイエンス学部 亀田 弘之
東京工科大学 コンピュータサイエンス学部 亀田 弘之
非決定性有限オートマトン 状態の有限集合 入力記号の有限集合 注意 動作関数 初期状態 受理状態の有限集合.
システムソフトウェア講義の概要 計算機システムの復習:中央演算処理装置(CPU),プログラムの実行,主記憶装置,補助記憶装置
文法と言語 ー文脈自由文法とLR構文解析2ー
情報数理Ⅱ 第10章 オートマトン 平成28年12月21日.
計算の理論 I プッシュダウンオートマトン 月曜3校時 大月 美佳 平成15年7月7日 佐賀大学知能情報システム学科.
情報処理Ⅱ 小テスト 2005年2月1日(火).
4.2 再帰下降解析 (1)再帰下降解析とは ■再帰下降解析(Recursive Descent Parsing)
Presentation transcript:

文法と言語 ー文脈自由文法とLR構文解析ー 2019/5/5 文法と言語 ー文脈自由文法とLR構文解析ー 和田俊和 資料保存場所 http://vrl.sys.wakayama-u.ac.jp/SS/

2019/5/5 前回までの復習

言語と文法 言語とは,ルールに従う記号列の無限集合である. 文法を与えることで言語が定義できる. 2019/5/5 言語とは,ルールに従う記号列の無限集合である. 文法を与えることで言語が定義できる. 文法にはタイプ0からタイプ3までのレベルがあり, プログラム言語としてはタイプ2「文脈自由文法」 プログラム中の字句の表現にはタイプ3「正規文法」 が用いられる.

文脈自由文法 2019/5/5 文脈自由文法(Context Free Grammar:CFG)は,前後の記号に関係なく「非終端記号1つ」を「非終端記号と終端記号から成る記号列」に置き換えるという生成規則 A→t のみを持つ文法 出発記号に対して生成規則の要素を何度か適用して終端記号列を得ることを「導出」と呼ぶ. 終端記号列と文法が与えられたとき,生成規則がどのように適用されたのか,つまり,導出の過程を求めることを「構文解析」と呼び,その結果,導出木が得られる. 導出木からそれを簡略化した「構文木(演算子木)」が求められ,それを利用した式の計算などが可能である.

2019/5/5 正規文法 正規文法は,「非終端記号1つ」を「終端記号」もしくは「終端記号 非終端記号」に置き換えるという生成規則 A→a or B→bB  のみを持つ文法 正規文法で表現できるのは,「整数」「実数」「識別子(変数名)」「キーワード」など,比較的単純な記号の並びである. 正規文法によって規定される言語は,正規表現によって表現することができる. 正規表現から,それに唯一に対応付けられる「非決定性有限状態オートマトン(NFA)」が機械的に対応付けられる.

2019/5/5 字句解析オートマトンの生成 機械的に求められたNFAは,ε-closureによる新たな状態の導入により計算機で実行可能なDFAに変換することができ,さらに状態数の最適化などが行われ,字句解析に用いられる. このような字句解析オートマトンを生成するプログラムに lex がある. lex は拡張された正規文法と,C言語プログラムを与えることで,簡単にオートマトンが生成できる.

文脈自由文法における導出 導出には最左導出と,最右導出があり,文法および構文解析法によっては,これらの導出が無限ループになることがある. 2019/5/5 文脈自由文法における導出 導出には最左導出と,最右導出があり,文法および構文解析法によっては,これらの導出が無限ループになることがある. 算術式の評価に於いては必ず,最右導出を行う必要がある. 最左導出は算術式以外の文を対象とした構文解析に用いることが可能であり,構文解析表とスタックを用いた「LL構文解析」,再帰呼び出しを用いた「再帰下降型構文解析」などがある. これら最左導出の構文解析アルゴリズムは,導出木を上から下へと辿る「下降型」構文解析法である.

確認の問題 push(‘a’,S), push(‘b’,S), pop(S), push(‘c’,S), pop(S),pop(S) 2019/5/5 確認の問題 push(‘a’,S), push(‘b’,S), pop(S), push(‘c’,S), pop(S),pop(S) 上の操作で,pop(S)によって取り出される記号列は?

LL構文解析問題(前回の問題) S→F S→-F+S F→1 2019/5/5 S→F S→-F+S F→1  上記文法の元で,-1+1をLL構文解析で構文解析するとどうなるか?構文解析表を求め,導出木を示しなさい.

構文解析表の作り方(例) - 1 + $ S 2 F 3 S→F S→-F+S F→1 Fi(F)=φ , Fi(S)=φ 2019/5/5 構文解析表の作り方(例) - 1 + $ S 2 F 3 S→F S→-F+S F→1 Fi(F)=φ , Fi(S)=φ Fi(S)={-}, Fi(F)={1}  S→FというルールからFi(S):=Fi(S)∪Fi(F)とする Fi(S)={-,1}, Fi(F)={1}

LL構文解析の結果 S→F S→-F+S F→1 - 1 + $ S 2 F 3 [S,$], 入力:- ルール2の適用 2019/5/5 S→F S→-F+S F→1 [S,$], 入力:- ルール2の適用 [-,F,+S,$], スタックと入力の‘-’を削除. [F,+,S,$], 入力:1 [1,+,S,$],入力:1,スタックと入力の1を削除 [+,S,$],入力:+スタックと入力の+を削除 [S,$],入力:1 ルール1の適用 [F,$],入力:1 ルール3の適用 [1,$],入力:1 スタックと入力の1を削除 意味:S→-F+S→-1+S→-1+F→-1+1 - 1 + $ S 2 F 3 S F S F - 1 + 1

2019/5/5 最右構文解析法 LR構文解析

最右導出と上昇型構文解析 最右導出を前提とした場合,上昇型の構文解析がしばしば用いられる. 上昇型構文解析では生成規則の右辺にマッチする部分を見つけ,それを左辺の非終端記号に置き換える「還元(reduction)」という操作を繰り返し,出発記号に到達する 導出 還元

還元操作を行うには手がかりが必要 <算術式>→<算術式><加減演算子><項>   という生成規則の右辺にマッチする部分を  1-2-3-4  という記号列から見つける問題を考える. 明らかに”1-2-3”が右辺の<算術式>に,次の”ー”が<加減演算子>に,そして”4”が<項>に対応付けられる. これをどうやって見つけるかが問題

LR法例題 アクション * + 1 $ E B s1 s2 3 4 r4 2 r5 s5 s6 r3 5 7 6 8 r1 r2 文法の例 2019/5/5 アクション GOTO 状態 * + 1 $ E B s1 s2 3 4 r4 2 r5 s5 s6 acc r3 5 7 6 8 r1 r2 文法の例 (1) <E> →<E>*<B> (2) <E> →<E>+<B> (3) <E> →<B> (4) <B> → 0 (5) <B> → 1

アクション表と,GOTO表 2019/5/5 アクション表は状態と終端記号でインデックス付けされている(終端記号 $ は入力の終わりを示す)。各マスには以下のようなアクションが記述されている: shift(sn): 次の状態遷移先を n とする. reduce(rm): m番の文法規則を実行する. accept(acc): 入力バッファにある文字列を受理する. GOTO表は状態と非終端記号でインデックス付けされており、各マスには非終端記号を解釈し終えた次に遷移する状態を示す.

LR法のアルゴリズム スタックを [0] と初期化する.(現在の状態は常にスタックトップの数字で表される) 2019/5/5 スタックを [0] と初期化する.(現在の状態は常にスタックトップの数字で表される) 現在の状態と入力にある記号からアクション表を参照する。ここで以下の4つのケースがある. sn に従って状態遷移する. (これは,還元を行う文字列を一つ右に伸ばす) 現在の終端記号を入力バッファから取り除く. 状態 n をスタックにプッシュする. rm に従って文法規則を適用する。 (これは還元操作) m 番の規則の右側にある各記号についてスタックから状態を削除する(例えば E * B なら3個ポップする)。 その時点のスタックのトップを状態とし、それと m 番の文法規則の左側からGOTO表を参照し、そこにある状態をスタックにプッシュして新たな状態とする. 受理(acc)の場合、文字列の構文解析が完了。 アクションが指定されていない場合、文法エラーとなる. 上のステップを「受理」となるか「文法エラー」となるまで繰り返す。

1+1$ の構文解析例 入力 意味 1+1$ [0] s2 2 +1$ [2,0] r5 4 [4,0] r3 3 [3,0] s6 6 1+1$ の構文解析例 2019/5/5 状態 入力 スタック アクション 意味 1+1$ [0] s2 1の部分を還元の候補にする (1)+1 2 +1$ [2,0] r5 1を<B>に還元する <B>+1 4 [4,0] r3 <B>を<E>に還元する <E>+1 3 [3,0] s6 +の部分を還元の候補にする <E>(+)1 6 1$ [6,3,0] <E>(+)(1) $ [2,6,3,0] <E>(+)<B> 8 [8,6,3,0] r2 <E>+<B>を<E>に還元する <E> acc 受理

導出木 (1) <E> →<E>*<B> + 1

問題 「0+1*1」の構文解析を上述の文法の下で行いなさい.導出木も示すこと.