言語理論とコンパイラ

第七回: 文脈自由言語と構文解析・上向き構文解析と下向き構文解析

2006 年 6月 9日

http://www.sw.it.aoyama.ac.jp/2006/Compiler/lecture7.html

AGU

© 2006 Martin J. Dürst 青山学院大学

目次

先週の宿題

(提出不要)

C プログラム言語の文法の例 (yacc 形式; typedef に要注意)

Java プログラム言語の文法 (BNF 形式)

先週のまとめ

字句解析と構文解析

字句解析 構文解析
解析対象 定数、識別子、予約語、演算子など 宣言、定義、式、文、関数など
要点 速さ 能力
記述方法 正規表現 文脈自由文法
(自動) 解析手段 有限オートマトン プッシュダウンオートマトン

正規文法と文脈自由文法

正規文法 (regular grammar):

文脈自由文法 (context free grammar):

文脈自由文法の一例

S → aSa | bSb | c

生成する言語: 真ん中に c が一個、周りに a と b が 0 以上対照的に自由な順番に並ぶ

生成する語の例: c, aca, bcb, abaabcbaaba 等

こういう風な言語を受理するのはメモリがないため有限オートマトンで は不可能

オートマトンの機能拡張が必要

オートマトンにプッシュダウンスタックをつけよう

プッシュダウンスタック

A stack of trays at the cafeteria. Only the topmost tray is visible due to a built-in spring.

プッシュダウンオートマトン

プッシュダウンオートマトンの一例

三スライド前の文法に相当するプッシュダウンオートマトンの図

決定性と非決定性のプッシュダウンオートマトン

効率よく構文解析できるには可能な限り決定性のある文法が必要

解析木と構文木

解析木:
葉は終端記号と (分析の途中の場合) 被終端記号
節は非終端記号
文法や解析方法の研究に使われる
構文木:
葉は終端記号の一部 (識別子、定数など)
節は被終端記号の一部に相当するが、終端記号の一部 (演算子、予約語) などをラベルに使う
一部の終端記号は無視 (特に括弧類)

解析木と構文木の例

文法:

E → E '+' E    (Expression, 式)

E → E '*' E

E → '(' E ')'

E → integer

入力の例:

5 + 3 * (7 + 2)

曖昧な文法

文法の曖昧性の除去

問題の例:

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

ヒント: 非終端記号の追加が必要