言語理論とコンパイラ

第九回: 上向き構文解析の原理

2013 年 6 月 14 日

http://www.sw.it.aoyama.ac.jp/2013/Compiler/lecture9.html

Martin J. Dürst

AGU

© 2005-13 Martin J. Dürst 青山学院大学

AGU

今日の予定

前回のまとめ

前回の文法の発展

出発点 (parser.c):
E → T '+' T | T
T → number
三つ以上の被演算子への対応 (parserA.c):
E → T '+' E | T
T → number
引き算の追加 (parserB.c):
E → T '+' E | T '-' E | T
T → number
右結合から左結合への変更 (parserC.c):
E → E '+' T | E '-' T | T
T → number
左再帰への対応 (parserD.c):
E → T ME
ME → '+' T ME | '-' T ME | ε
T → number

 

更なる文法の発展

下向き構文解析と上向き構文解析

下向き構文解析 (top-down parsing):
解析木を上から (初期記号から) 作る
上向き構文解析 (bottom-up parsing):
解析木を下から (終端記号から) 作る
途中に複数の (小さな) 解析木がある

下向き構文解析と上向き構文解析

下向き構文解析 上向き構文解析
一般的な方法 バックトラック 動的プログラミング (CYK アルゴリズム)
広く使われている方法 再帰的下向き構文解析 LR 法

導出の順番: 最左導出と最右導出

簡単な例:

E → E '+' T
T → integer

最左導出の場合に、いつも最も左の非終端記号を置き換える

最右導出の場合に、いつも最も右の非終端記号を置き換える

文法の種類の呼び方

LALR 構文解析の原理

スタックを使って読んだトーケンや途中の非終端記号を蓄積

オートマトンを使ってできるだけ簡単な操作で次のステップを決定

(LA)LR 構文解析の三つのオペレーション

Shift と Reduce の具体例

上向き構文解析の利点と問題点

曖昧な文法

 

文法の曖昧性の除去

問題の例:

E → E '-' E | integer

入力 4 - 5 - 7 に対して複数の解析木が作成可能

解析木によって計算結果が違う

解決方法: 文法の書き換え (左結合の場合)

E → E '-' integer | integer

bison の概要

演習例: 簡単な電卓

スタートのためのファイル: makefile, calc.y, calc.lex

bison のマニュアル

bison の仕組みとデバッグ

bison の開発のコツ

calc 用テストファイル: test.in, test.check

属性文法

(attribute(d) grammar(s))

flex と bison の使い方の概要

make の活用