言語理論とコンパイラ
第七回:
文脈自由言語と構文解析・上向き構文解析と下向き構文解析
2006 年 6月 9日
http://www.sw.it.aoyama.ac.jp/2006/Compiler/lecture7.html
© 2006 Martin
J. Dürst 青山学院大学
目次
- 文脈自由文法
- プッシュダウンオートマトン
- 解析木と構文木
- 曖昧な文法
先週の宿題
(提出不要)
- C
プログラム言語など知っている言語やデータ形式の文法を調べなさい。
C プログラム言語の文法の例
(yacc 形式; typedef
に要注意)
Java プログラム言語の文法
(BNF 形式)
先週のまとめ
- 正規表現やそれと同等の表現力を持つツールには限界がある
(例: 括弧の入れ子構造など)
- 正規表現などは構文解析には使えないが、字句解析には使える
- コンパイラで字句解析と構文解析に分けると分かりやすい構造になる
- 更に、正規表現・有限オートマトンによって字句解析の速い実装が簡単に作れる
字句解析と構文解析
|
字句解析 |
構文解析 |
解析対象 |
定数、識別子、予約語、演算子など |
宣言、定義、式、文、関数など |
要点 |
速さ |
能力 |
記述方法 |
正規表現 |
文脈自由文法 |
(自動) 解析手段 |
有限オートマトン |
プッシュダウンオートマトン |
正規文法と文脈自由文法
正規文法 (regular grammar):
文脈自由文法 (context free grammar):
- 文法の導出規則の左側は全て非終端記号一つ
- 導出規則の右側は制限なし
(非終端記号も終端記号も何個も使ってよい)
- 例: A → aBb, B → aaB, S → aBaAb 等
- 「自由」の意味:
依存しない、左右されない、関係ない
- プログラム言語の構文は周りが関係なくてその場で正しいかどう
か判断できる
- (意味解析も含まれると文脈自由ではなくなる)
文脈自由文法の一例
S → aSa | bSb | c
生成する言語: 真ん中に c が一個、周りに a と b が 0
以上対照的に自由な順番に並ぶ
生成する語の例: c, aca, bcb, abaabcbaaba 等
こういう風な言語を受理するのはメモリがないため有限オートマトンで
は不可能
オートマトンの機能拡張が必要
オートマトンにプッシュダウンスタックをつけよう
プッシュダウンスタック
- 受理する言語の記号と別のプッシュダウン記号を記憶できる
- 一番上の記号しか見えない
- 一番下に特別な記号 (ボトムマーカ) がある
プッシュダウンオートマトン
- 遷移は入力記号だけではなくて、スタックの上に見える記号にも依存する
- 遷移でのスタックについての動作:
一番上のスタック記号を取るか、スタックをそのまま残すか、スタックに記号を追加するのか
- 開始の時、ボトムマーカだけのスタック
- 受理はボトムマーカだけのスタックや受理状態の時
(複数の種類あり)
プッシュダウンオートマトンの一例
- a, b, c は言語の記号
- スタックは左が上で想定されている
- A/BA はスタックの一番上が A の場合に BA に変わる
(つまり、B を上乗せ)
決定性と非決定性のプッシュダウンオートマトン
- S → aSa | bSb | c
の文法の場合には決定性プッシュダウンオートマトンで実現可能
- S → aSa | bSb | ε
の文法の場合には決定性プッシュダウンオートマトンで実現不可能。
なぜかというと語の真ん中の印がない。
- 有限オートマトンと違って、決定性と非決定性のプッシュダウンオートマトンの性能
(受理能力) が違う
効率よく構文解析できるには可能な限り決定性のある文法が必要
解析木と構文木
- 解析木:
- 葉は終端記号と (分析の途中の場合) 被終端記号
- 節は非終端記号
- 文法や解析方法の研究に使われる
- 構文木:
- 葉は終端記号の一部 (識別子、定数など)
- 節は被終端記号の一部に相当するが、終端記号の一部
(演算子、予約語) などをラベルに使う
- 一部の終端記号は無視 (特に括弧類)
解析木と構文木の例
文法:
E → E '+' E
(Expression, 式)
E → E '*' E
E → '(' E ')'
E → integer
入力の例:
5 + 3 * (7 + 2)
曖昧な文法
- 例:
5 + 3 * 7
は (5+3) * 7
か 5 +
(3*7)
か
- 文法が両方の解釈を許す
- ある入力に対して複数の解析木を許す文法は曖昧な文法
(ambiguous grammar) と言う
- 一部の文法の場合、変換によって曖昧性が取り除かれる
- 変換のアルゴリズムや変換が可能かどうかを決めるアルゴリズムは存在しない
- 曖昧な文法は言語の構文だけの定義には使えるが、プログラム言語やデータ形式には向いてない
- 文法の曖昧性とプッシュダウンオートマトンの非決定性は同じものではない
(例: 左右対称の文字列)
文法の曖昧性の除去
問題の例:
E → E '+' E | integer
入力 4 + 5 + 7
に対して複数の解析木が作れる
'+'
の場合には計算は同じ結果ですが、他の演算子の場合にはそうとも限らない
解決方法: 文法の書き換え
E → E '+' integer | integer
解析の実装: 下向き解析と上向き解析
- 下向き構文解析 (top-down parsing):
- 解析木を上から (初期記号から) 作る
- 上向き構文解析 (bottom-up parsing):
- 解析木をしたから (終端記号から) 作る
- 途中に複数の (小さな) 解析木がある
宿題
提出: 6月16日 (金) 10:45 までに O 棟 529 号室の前; A4
一枚
次の文法の曖昧性を除去し、曖昧性のない文法を提出しなさい。曖昧性がないことを複数の例で確認してください。
E → E '+' E
(Expression, 式)
E → E '*' E
E → '(' E ')'
E → integer
ヒント: 非終端記号の追加が必要