情報工学実験 コンパイラ 演算子順位構文解析 (2013年度) 内容 • BNFによる言語定義 • 表駆動型オートマトンによる字句解析 • 演算子順位構文解析 • 再帰下降型構文解析 • オブジェクトコード生成 – 本実験では CPU 実験で作成する CPU 用の アセンブリ言語をオブジェクトコードとする http://www.edu.cs.okayama-u.ac.jp スケジュール 4/9 全体説明・言語定義説明 4/15 字句解析解説・実装 4/22,23 字句解析実装 4/30, 5/7 演算子順位構文解析説明・実装 5/8,13 演算子順位構文解析実装 5/14,20 演算子順位構文解析実装 5/21 再帰下降型構文解析説明・実装 5/27 再帰下降型構文解析実装 6/3,10,17 コード生成説明・実装 6/24 中間面接(コード生成) 7/1, 8 コード生成 7/22, 23, 29, 30 面接 構文解析手続き • 上向き構文解析法 – 終端記号を非終端記号に還元 – 解析木を下から上に生成 • 下向き構文解析法 – 生成規則を使って左辺から右辺に変換 – 解析木を上から下に作成 解析木(構文木) 算術式 <算術式>::=<算術式><加減演算子><項> | <項> <項>::=<項><乗除演算子><因子> | <因子> <因子>::=<識別子> | (<算術式>) <加減演算子>::= + | 項 <乗除演算子> ::= * | / 項 因子 算術式 算術式 項 項 因子 因子 因子 識別子 識別子 + ( b 識別子 c ) a * 主な構文解析手法 1. 演算子順位構文解析 • 演算子順位文法にのみ適用可能 2. 再帰下降型構文解析 • 生成規則の左辺を右辺に変換する方法 3. LR 構文解析 • 解析手続きの自動生成に使用 算術式の解析 • 特徴: 算術式は左から解釈していくだけ ではダメ – 乗除算は加減算より優先される – 括弧で優先順位が変わる • 演算子順位構文解析を使う (再帰下降型構文解析では無駄が多い) 演算子順位構文解析 • 演算子順位文法でなければ適用できない • 演算子の優先順位を正しく扱うことが可能 • 算術式に対してのみ使われる 演算子順位文法 • 隣接した非終端記号を持たない A ::= … B C … という生成規則はない ただし,A,B,C は非終端記号 • 終端記号間には <, >, = のうちたかだか1 個の関係しか成り立たない 演算子間の関係 • a = b a と b が隣り合っているか,または一つの 非終端記号を挟む場合 例: <因子> ::= ( <算術式> ) なので ( = ) 演算子の関係 • a < b a の右隣に非終端記号Aが現れ,Aが,最 初の終端記号がbである文字列を導出で きる 例: <算術式> ::= <算術式> + <項> <項> ::= <因子> * <項> この場合 + < * 演算子の関係 • a > b b の左隣に非終端記号Aが現れ,Aが,最 後の終端記号が a である文字列を導出で きる 例: <因子> ::= ( <算術式> ) <算術式> ::= <算術式> + <項> このとき + > ) 演算子の関係(まとめ) • a = b A → …ab… または A → …aBb… • a < b B → …aA…という生成規則が存在し, A → b… または A → Cb… • a > b B → …Ab…という生成規則が存在し, A → …a または A → …aC ただし,小文字は終端記号,大文字は非終端記号 算術式の始めと終わり • 算術式は $ と $ で囲まれていると考える • <算術式’> ::= $ <算術式> $ – 最初の $ は初期設定で積む – 最後の $ は算術式の終わりであることがわ かったら読み取ったことにする 演算子順位行列 • $ の順位も必要 • 本来は「数字」「識別子」にも順位は存在 (後で述べるアルゴリズムでは不要) 演算子順位法による構文解析手順 識別子・数値用の stack[0] 演算子用の stack[1] • 識別子と数値は stack[0]に積む • 演算子は – stack[0]が空またはstack[1]の最上部よりこの 演算子の順位が高ければstack[1]に積む – それ以外は木構造を作成(再帰的に処理) ただし ( は破棄 構文木の形 B*C+D/E 四つ組による表現 (*, B, C, T1) (/, D, E, T2) (+, T1, T2, T3) 逆ポーランド記法による表現 日本語の語順と同じ A + B → A B + B * C + D / E → B C * D E / + BにCをかけたものとDをEで割ったものを 加えたもの 演算子順位構文解析アルゴリズム • ウェブページ参照 演算子順位表 • (A+B/C)*(D-E) の処理過程をホワイトボー ドで説明 本日の作業内容 • 作業目標 – 各自で演算子順位アルゴリズムの演習問題を行い、 グループで答え合わせをすること – 演算子順位行列の作成 – 構文木のデータ構造の決定 – push, pop, top 関数の作成 • 分担できる作業は分担して行うこと • 作業報告書とともに演算子順位表を提出のこと (最終レポートに入れてもらうので各自持っておく こと) • 演習問題の答えも提出のこと(手書き可) 作業内容の説明(1) • 演算子順位行列の作成 ウェブを参照 oparser.cに入れる • 演算子順位行列のための型定義 defin.hに入れる • typeToOpeType oparser.cに入れる • 構文木のデータ構造 ウェブを参照 defin.hに入れる 作業内容の説明(2) • 関数 push, pop, top スタックに関する関数 2つのスタックを操作することに注意 各グループでスタックの実現については相 談して決めること • これらの関数はoparser.cというファイルに 入れる 実験をすすめる上での注意 • 時間があればスタックを扱う関数が正しく 動くかどうかを確認すること
© Copyright 2024 Paperzz