言語理論とコンパイラ

第十一回: エラー処理、中間表現

2015 年 6 月 19 日

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

Martin J. Dürst

AGU

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

今日の予定

前回の残り

前回のまとめ

 

 

文法のパターン: 繰り返し

一回以上の繰り返し:

項目列: 項目列 項目
| 項目
;

ゼロ回以上の繰り返し:

項目列: 項目列 項目
|
;

項目列 項目」の代わり「項目 項目列」も使えるが、bison のスタックの長さが問題になる可能性

 

文法のパターン: 結合

左結合の場合:

大式: 大式 左結合演算子 小式
| 小式
;

右結合の場合:

大式: 小式 右結合演算子 大式
| 小式
;

 

文法のパターン: 優先度

(優先度は 小式 > 中式 > 大式; 左結合の場合)

大式: 大式 演算子 中式
| 中式
;
中式: 中式 演算子 小式
| 小式
;

 

文法のパターン: 括弧類

小式: 開括弧 大式 閉括弧
| 定数
;

 

構文エラーの処理

 

エラー処理の難しさ

 

エラー処理の要点

 

エラー処理の技法

 

bison でのエラー処理

 

コンパイラの段階

字句解析 (lexical analysis)

構文解析 (parsing; syntax analysis)

意味解析 (semantic analysis)

コード生成 (code generation)

最適化 (optimization)

中間表現: 名前表

(symbol table)

名前表が扱うデータ

中間表現: 構文木

構文木の生成: 書換規則ごとの処理で生成。例:

exp: exp '+' term { $$ = $1 + $3; }

を次に変える:

exp: exp '+' term
{ $$ = newnode(PLUS, $1, $3); }

(YYSTYPE も変更)

構文木では二分木が多いが、関数の引数などに特別な措置が必要

(簡単なプログラム言語 (例: Pascal)と簡単な計算機構造 (例: スタック・マシーン)
の場合、構文解析しながらのコード生成 (構文木を生成しない) が可能)