コンパイラ 2011年10月20日 酒居敬一@A468(sakai.keiichi@kochi-tech.ac.jp) http://www.info.kochi-tech.ac.jp/k1sakai/Lecture/COMP/2011/index.html.

Slides:



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

プログラミング言語論 第3回 BNF 記法について(演習付き) 篠埜 功. 構文の記述 プログラミング言語の構文はどのように定式化できるか? 例1 : for ループの中に for ループが書ける。 for (i=0; i
平成 19 年度卒業研究 PASCAL コンパイラについ て 福永研究室 山川 武志 畑中 陽介 佐藤 遼.
和田俊和 資料保存場所 /2/26 文法と言語 ー正規表現とオートマトンー 和田俊和 資料保存場所
プログラミング言語論 第10回(演習) 情報工学科 木村昌臣   篠埜 功.
Problem J: いにしえの数式 問題作成・解説: 北村 解答作成協力: 八森.
基本情報技術概論 I 演習(第5回) 埼玉大学 理工学研究科 堀山 貴史
文法と言語 ー字句解析とオートマトンlexー
言語処理系(7) 金子敬一.
コンパイラ 2011年10月17日
アルゴリズムとデータ構造 2013年6月18日
言語処理系(4) 金子敬一.
12.3,E,-15, 12.3,E5,+,=, >,<,…,
数値計算及び実習 第3回 プログラミングの基礎(1).
言語処理系(6) 金子敬一.
文法と言語 ー文脈自由文法とLR構文解析2ー
プログラミング言語論 第6回 型 情報工学科 篠埜 功.
アルゴリズムとデータ構造 2012年6月14日
文法と言語 ー文脈自由文法とLL構文解析ー
プログラミング言語論 第4回 式の構文、式の評価
アルゴリズムとデータ構造 2011年6月13日
言語処理系(5) 金子敬一.
システム開発実験No.7        解 説       “論理式の簡略化方法”.
コンパイラ 2012年10月15日
コンパイラ 2012年10月22日
ML 演習 第 7 回 新井淳也、中村宇佑、前田俊行 2011/05/31.
アルゴリズムとデータ構造 2011年6月14日
コンパイラ 2011年10月24日
システムソフトウェア講義の概要 計算機システムの復習:中央演算処理装置(CPU),プログラムの実行,主記憶装置,補助記憶装置
コンパイラ 第14回 上昇型構文解析(2) 38号館4階N-411 内線5459
言語プロセッサ 第7回目 平成27年11月16日.
プログラミング言語論 第3回 BNF記法について(演習付き)
文法と言語 ー字句解析とオートマトンlexー
文法と言語 ー字句解析とオートマトンlexー
形式言語の理論 5. 文脈依存言語.
アルゴリズムとデータ構造1 2006年6月16日
アルゴリズムとプログラミング (Algorithms and Programming)
コンパイラ 第13回 上昇型構文解析(1) 38号館4階N-411 内線5459
言語と文法 言語とは,ルールに従う記号列の無限集合である. 文法を与えることで言語が定義できる.
コンパイラ 2011年10月6日
文法と言語 ー文脈自由文法とLR構文解析2ー
言語プロセッサ ー第9回目ー 構文解析(続き).
文法と言語 ー文脈自由文法とLR構文解析3ー
プログラミング言語論 第9回 情報工学科 木村昌臣 篠埜 功.
文法と言語 ー文脈自由文法とLL構文解析ー
コンパイラ 2012年10月4日
文法と言語 ー文脈自由文法とLR構文解析ー
コンパイラ 2012年10月29日
アルゴリズムとデータ構造 2012年6月11日
文法と言語 ー字句解析とオートマトンlexー
東京工科大学 コンピュータサイエンス学部 亀田 弘之
4.プッシュダウンオートマトンと 文脈自由文法の等価性
情報処理Ⅱ 2005年10月28日(金).
システムソフトウェア講義の概要 計算機システムの復習:中央演算処理装置(CPU),プログラムの実行,主記憶装置,補助記憶装置
コンパイラ 2012年10月11日
プログラミング 4 文字列.
プログラミング入門2 第6回 関数 情報工学科 篠埜 功.
言語プロセッサ ー第9回目ー 構文解析(続き).
言語プロセッサ ー第7回目ー 構文解析(続き).
東京工科大学 コンピュータサイエンス学部 亀田 弘之
東京工科大学 コンピュータサイエンス学部 亀田 弘之
システムソフトウェア講義の概要 計算機システムの復習:中央演算処理装置(CPU),プログラムの実行,主記憶装置,補助記憶装置
文法と言語 ー文脈自由文法とLR構文解析2ー
プログラミング演習I 2003年6月11日(第9回) 木村巌.
:: の扱い 長谷川啓.
オブジェクト指向言語論 第三回 知能情報学部 新田直也.
プログラミング入門2 第3回 条件分岐(2) 繰り返し文 篠埜 功.
情報処理Ⅱ 第8回:2003年12月9日(火).
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
4.2 再帰下降解析 (1)再帰下降解析とは ■再帰下降解析(Recursive Descent Parsing)
Presentation transcript:

コンパイラ 2011年10月20日 酒居敬一@A468(sakai.keiichi@kochi-tech.ac.jp) http://www.info.kochi-tech.ac.jp/k1sakai/Lecture/COMP/2011/index.html

構文解析 字句の列を入力とする。 字句の列として表されたプログラムが、文法のどの部分 に対応するかを解析する。 今回の内容 字句の列は字句解析器から出力される。 字句の列として表されたプログラムが、文法のどの部分 に対応するかを解析する。 今回の内容 構文解析の概論 下向き構文解析法の説明 下向き構文解析法の問題点と解決法

構文解析の役割 プログラミング言語の文法はBNFなどで記述される。 それに基づいてソースプログラムの字句が解析される。 字句の列から文法で許される並びであるかどうか調べる。 許されなれない並びであればエラーとする。 許される並びであれば、解析木を生成し構文木を出力する。 さらに変数や関数の名前は名前表に出力する。 ソース プログラム 構文解析 字句解析 字句出力 字句要求 構文木 名前表

構文規則(生成規則) この例では、乗算は加算よりも 先に行うことを示している。 非終端記号 終端記号 → 演算順序を文法で規定している。 この例では、乗算は加算よりも 先に行うことを示している。 演算順序を文法で規定している。 非終端記号 式・項・因子・名前 終端記号 a・b・c → 左辺の非終端記号を右辺に 書き換え可能であることを示す。 【式の構文規則】 式 → 項|式+項 項 → 因子|項*因子 因子 → 名前|(式) 【文法G1】 式 → 式+項 式 → 項 項 → 項*因子 項 → 因子 因子 → (式) 因子 → 名前 名前 → a|b|c

構文図式 BNFと記述力は変わらない。 直感的でわかりやすい。 [プログラム] 関数定義 変数宣言 ; 返戻型 ブロック 識別子 ( ) , [関数定義] [変数宣言] 要素型 識別子 文 { } [ブロック]

[文] 式 return 条件式 ブロック 文 識別子 変数宣言 ; ( = if while ) 関数呼出し 識別子 式 ( ) , [関数呼出し] [式] 項 加減演算子 [項] 因数 乗除演算子

[条件式] 式 == != > < >= <= [加減演算子] [乗除演算子] + - * / 要素型 void [数字]と[英字]は非終端記号なので、 本来はそれらも終端記号に至るまでの 定義が必要。しかし、省略されている。 前回のBNFの例でも省略されている。 [返戻型] 数字 英字 [識別子] [整数] 数字 int [要素型]

解析木では葉に終端記号で 末端以外が非終端記号 式a*(b+c)の解析木と構文木 項 因子 式 名前 a b c ( ) * + 文法解析ではこれらの木を生成する。 解析木では葉に終端記号で 末端以外が非終端記号 a * b + c 構文木 解析木

構文解析法 一般にはふた通りに分類可能。 上向き構文解析。 下向き構文解析。 解析木を下から生成していく。 右辺と一致する入力列を左辺に置き換える。 下向き構文解析。 解析木を上から生成していく。 生成可能な解析木を仮定し、一致するかどうかで解析をすすめる。 【文法G1】 式 → 式+項 式 → 項 項 → 項*因子 項 → 因子 因子 → (式) 因子 → 名前 名前 → a|b|c

上向き構文解析法 項 因子 式 名前 a b c + * 解析木の下のほう、 終端記号の非終端記号の 置き換えから始まる解析法。 右辺が一致し左辺に置き換えることを 還元という。 記号列: a+b*c 7を適用: 名前+名前*名前 6を適用: 因子+因子*因子 3,4を適用: 因子+項*因子 ⇒ 項+項*因子 項+項 1,2を適用: 式+項 式 上向き構文解析法については大学院で詳しくやります。 ここでは、概論だけ。 教科書では省略されているがシフトという操作もあるし、シフト・還元の間での競合もある。

下向き構文解析法 解析木を根のほうから生成する。 木の形を仮定して葉に至るかどうかを調べる。 葉に至るまで木が完成しなければ、読み込んだ字句は戻して 別の形を探っていく。別の形が尽きたらエラーになる。 仮定⇔後戻り、を繰り返す。 void S(){ aを読む; A(); /* Aを読む */ bを読む; dを読む; } void A(){ cを読む; または /* 解析が失敗して後戻りが発生したら */ void A(){ aを読む; B(); /* Bを読む */ cを読む; }    直接導出の例

acbdの解析手順例 最も左にある非終端記号から解析を始めている。 文法の展開に失敗したら後戻りがある。 最左導出という。 解析手順 入力記号 文法の適用 解析結果 a c b d S → a A b d 1 a A b d ○ 2 c b d A → c b | c 3 c b 4 d × 5 6 c 7 b d

下向き構文解析の問題点 再帰的なプログラムで実現できない文法がある。 左再帰性の問題という。 再帰呼び出しが無限ループする。 左辺の非終端記号に対し、右辺に複数の生成規則 があるときに、どれを仮定すべきか一意に決まらない。 バックトラック問題という。 前のページの3~6のところ。 void 式(){ 式(); +を読む; 項(); }

左再帰性の除去 問題のある文法。 これを次のように書き換える。 一般には次の形をとるときが問題で、 このように書き換える。

バックトラック バックトラック法で解は求まるが、やはり速いほうがいい。 そこで、共通部分がある場合にくくりだす。 次のように書き換える。 void A(){ cを読む; bを読む;    または /* 解析が失敗してバックトラックが発生したら */ 何も読まない; }

を に置き換えて解析。 の形の場合、 という形に文法を変形する。 バックトラックがなくなるわけではない。 解析手順 入力記号 文法の適用     を    に置き換えて解析。 解析手順 入力記号 文法の適用 解析結果 a c b d S → a A b d 1 a A b d ○ 2 c b d  A → c A' 3 c A' 4 b d  A' → b |ε 5 b 6 d × 7 A' → b |ε 8 の形の場合、 という形に文法を変形する。 バックトラックがなくなるわけではない。