言語理論とコンパイラ

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

2011 年 6 月 10 日

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

Martin J. Dürst

AGU

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

AGU

今日の予定

flex の演習の正解例

読みやすさのため、コメントを /x x/ にし、スペースを使用

第一案: /x .* x/ 問題: /xx/ /xx/ をまとめて認識

第二案: /x [^x]* x/ 問題: /xxx/ を認識しない

第三案: /x ([^x]|x[^/])* x/ 問題: /x xx/ /x x/ をまとめて認識

第四案: /x ([^x]|x+[^/])* x/ 問題: 以前と同様

第五案: /x ([^x]|x+[^/x])* x/ 問題: /x xx/ を認識しない

第六案: /x ([^x]|x+[^/x])* x+/ 完成!

参考: Mastering Regular Expressions, Jeffrey E.F. Friedl, pp. 168,...

前回の文法の発展

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

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

bison とは

演習例: 簡単な電卓

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

flex と bison の使い方の概要

bison のマニュアル

make の活用

bison の仕組みとデバッグ

bison の開発のコツ

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

宿題

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

簡単な電卓を有理数の電卓に拡張してください。

有理数の表現方法として、[分子,分母] を追加 してください。

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

.lex.y のファイルを印刷して提出。A4 両面印刷、表紙なし、左上ホチキス止め、名前と学生番号をコメントに記述。

優先度と結合規則は文法で定義 (%left, %right など使わないこと)

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