第十回: yacc 系ツールの演習 (続き)・意味解析と中間表現
2009 年 6 月 19 日
http://www.sw.it.aoyama.ac.jp/2009/Compiler/lecture10.html
© 2005-9 Martin J. Dürst 青山学院大学
提出: 再来週の木曜日 (6 月 26日) 19 時 00 分、O 棟 529 号室の前
簡単なプログラム言語をflex と bison
で実現して、.lex
と .y
のファイルを印刷して提出
;
で区切る。制御文、関数 は無し
(発展問題として if
文に挑戦してもよい)print (式)
で「式」の結果を改行付きで印刷 (注: 先週から変更)#
から行末まではコメントint
優先順位 | 演算子 (必修) | 演算子 (発展) | 結合規則 |
1 | () |
→ | |
2 | 単項の - |
前置の ++ ; 前置の -- |
← |
3 | ← | ||
4 | * ; / ; % |
→ | |
5 | + ; - |
→ | |
6 | << ; >> |
→ | |
7 | < ; > |
<= ; >= |
→ |
8 | == ; != |
→ | |
9 | & |
→ | |
10 | ^ |
→ | |
11 | | |
→ | |
12 | && |
→ | |
13 | || |
→ | |
14 | ? : |
← | |
15 | = |
+= など |
← |
16 | , |
→ |
文法 | Type | 言語 | オートマトン |
句構造文法 | 0 | 句構造言語 | チューリング機械 |
文脈依存文法 | 1 | 文脈依存言語 | 線形拘束オートマトン |
文脈自由文法 | 2 | 文脈自由言語 | プッシュダウンオートマトン |
正規文法 | 3 | 正規言語 | 有限オートマトン |
error
トークンを文法に追加できる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 (コンパイル可能か)