第十一回: エラー処理、意味解析と中間表現
2012 年 6 月 29 日
http://www.sw.it.aoyama.ac.jp/2012/Compiler/lecture11.html
© 2005-12 Martin J. Dürst 青山学院大学
bison -v
で作成される .output
ファイルと #define YYDEBUG 1
で出力される情報で確認可能提出: 再来週の木曜日 (7月5日) 19 時 00 分、O 棟 529号室の前
簡単な電卓を複素数の電卓に拡張
複素数の表し方は 5i
で虚数を表し、[実部,虚部]
で複素数を表す
[]
内には実数演算は可能が 5i
などが不可能に文法を設計
complex.lex
と complex.y
を提出
A4 両面印刷、表紙なし、左上ホチキス止め、名前と学生番号をコメントに記述
来週質問が可能なので、よく準備し、おおくの質問ができるようにすること!
入力の例: test.in
makefile
内も).y
で追加のトークンを定義.lex
で追加のトークンを認識YYSTYPE
は有理数が表現できる構造体;
両方の入力ファイルに同様に定義.output
ファイルを見て検討error
トークンを含む規則を文法に追加可能statement: ... SEMICOLON { ... } | error SEMICOLON { yyerror("Statement error.\n"); yyerrok; }
error
トークンの含まれる規則までエラー前のトークンや非終端記号を無視error
トークンの後に来る入力も無視字句解析 (lexical analysis)
構文解析 (parsing; syntax analysis)
意味解析 (semantic analysis)
最適化 (optimization)
コード生成 (code generation)
(symbol table)
簡単なプログラム言語と簡単なマシーン・アーキテクチャの場合 (例えば Pascal からスタック・マシーン) には構文解析しながらコード生成を行う (構文木を生成しない) こともある
構文木の生成: 構文規則ごとの処理で生成。例:
expression: expression '+' term { $$ = $1 + $3; }
を次に変える:
expression: expression '+' term
{ $$ = newnode(PLUS, $1, $3); }
(YYSTYPE
も変更)
構文木では二分木が多いが、関数の引数などに特別な措置が必要
(semantic analysis)
(type equivalence)
型が同じかどうか複数の定義がある:
C の例: type-equivalence.c (コンパイル可能か)