第十回: yacc 系ツールの演習 (続き)・意味解析と中間表現
2005 年 6月30日
http://www.sw.it.aoyama.ac.jp/2006/Compiler/lecture10.html
© 2006 Martin J. Dürst 青山学院大学
7月11日 (火曜日) 4限 E202
途中経過のファイル: makefile, calc.y, calc.lex
今回の改善:
YYSTYPE
の変更, 正規表現の変更など)makefile
の変更など)bison -v
で作った機械の明細のファイルを作成 (例: calc.output)#define YYDEBUG 1
でデバッグを ON提出: 再来週の金曜日 (7月7日) 10時45分、O 棟 529号室の前
簡単な電卓を複素数の電卓に拡張してください。複素数の表し方は
5i
で虚数を表し、[実部,虚部]
で複素数を表すようにして下さい。[]
内には実数演算は許されるが 5i
みたいなものが使えないように文法を設計してください。
complex.lex と complex.y を提出ください。紙の大きさは A4。複数の紙はホチキスで止めること。
i
は掛け算として扱った方がやりやすい (i
は *√-1 として扱う)文法 | Type | 言語 | オートマトン |
句構造文法 | 0 | 句構造言語 | チューリング機械 |
文脈依存文法 | 1 | 文脈依存言語 | 線形拘束オートマトン |
文脈自由文法 | 2 | 文脈自由言語 | プッシュダウンオートマトン |
正規文法 | 3 | 正規言語 | 有限オートマトン |
error
トーケンを文法に追加できるerror
トーケンの含まれる規則までエラー前のトーケンや非終端記号を捨てるerror
トーケンの後に来るトーケンが来る入力も捨てる字句解析 (lexical analysis)
構文解析 (parsing; syntax analysis)
意味解析 (semantic analysis)
最適化 (optimization)
コード生成 (code generation)
簡単なプログラム言語と簡単なマシーン・アーキテクチャの場合 (例えば Pascal からスタック・マシーン) には構文解析しながらコード生成を行う (すなわち構文木を生成しない) こともある
構文木の生成: 構文規則ごとの処理で生成。例:
expression: expression '+' term { $$ = $1 + $3; }
を次に変える:
expression: expression '+' term
{ $$ = newnode(PLUS, $1, $3; }
(YYSTYPE
も変更)
構文木は普通二分木が、関数の引数などに特別な措置が必要
型が同じかどうか複数の定義がある: