言語理論とコンパイラ

第十回: 上向き構文解析の詳細

2015 年 6 月 12 日

http://www.sw.it.aoyama.ac.jp/2015/Compiler/lecture10.html

Martin J. Dürst

AGU

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

今日の予定

前回のまとめ

優先度の取扱い

 

結合方向の取扱い

 

繰返しの取扱い

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

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

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

簡単な文法の例:

E → E '+' T
T → integer

入力例: 5 + 7 + 3

解析方法の種類

ラベルは文法にも使用: 「この文法は LL(1)」(で解析可能)

bison の仕組みとデバッグ

.output の読み方

LALR 構文解析の原理

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

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

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

bison の書換規則の文法

書換規則 → 非終端記号 ":" 右辺列 ";"
右辺列 → 右辺 | 右辺 "|" 右辺列
右辺 → 記号列 "{" C言語 "}"
記号列 → 記号 | 記号 記号列
記号 → 非終端記号 | 終端記号

flexbison の使い方の概要

曖昧な文法

 

文法の曖昧性の除去

問題の例:

E → E '-' E | integer

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

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

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

E → E '-' integer | integer

 

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

宿題

提出: 再来週の木曜日 (6 月 25日) 19 時 00 分、O 棟 529 号室の前

簡単な電卓を有理数の電卓に拡張、有理数の表現方法として、[分子,分母] を追加

[] 内には割り算は許されないように文法を設計

出力は約分したもの (例: Result: -53/17)

優先度と結合規則は文法で定義 (%left, %right など使用禁止)

.lex.y のファイルを印刷して提出 (等幅の書体、A4 両面印刷 (↓↑のではなく↓↓)、表紙なし、左上ホチキス止め、名前、フリガナ、学生番号を1面の右上のコメントに記述)

来週質問が可能なので、よく準備して質問できるようにすること!

 

宿題のヒント