言語理論とコンパイラ

第九回: 上向き構文解析、yacc 系ツールの使い方

2012 年 6 月 15 日

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

Martin J. Dürst

AGU

© 2005-12 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

更なる文法の発展

上向き構文解析の単純な実装: Dynamic Programming

(lecture7 の Cocke–Younger–Kasami アルゴリズムを参照)

bison の概要

演習例: 簡単な電卓

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

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

曖昧な文法

文法の曖昧性の除去

問題の例:

E → E '-' E | integer

入力 4 - 5 - 7 に対して複数の解析木が作れる

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

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

E → E '-' integer | integer

bison のマニュアル

bison の仕組みとデバッグ

bison の開発のコツ

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

属性文法

(attribute(d) grammar(s))

flex と bison の使い方の概要

make の活用

宿題

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

calc.y を、test.in から test.checkになるように完成

calc.y を A4 (両面印刷、表紙なし、左上ホチキス止め、名前と学生番号をコメントに記述) で提出