言語理論とコンパイラ

第十一回: エラー処理、意味解析と中間表現

2012 年 6 月 29 日

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

Martin J. Dürst

AGU

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

今日の予定

前回のまとめ

 

これからの予定

宿題: 複素数の電卓

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

簡単な電卓を複素数の電卓に拡張

複素数の表し方は 5i で虚数を表し、[実部,虚部] で複素数を表す

[] 内には実数演算は可能が 5i などが不可能に文法を設計

complex.lexcomplex.y を提出

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

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

入力の例: test.in

 

宿題のヒント

 

構文エラー処理

エラー処理の難しさ

エラー処理の要点

エラー処理の技法

bison でのエラー処理

コンパイラの段階

字句解析 (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 (コンパイル可能か)