2015 年 6 月 19 日
http://www.sw.it.aoyama.ac.jp/2014/Compiler/lecture11.html
© 2005-15 Martin J. Dürst 青山学院大学
bison -v
で作成される .output
ファイルと #define YYDEBUG 1
で出力される情報で確認可能一回以上の繰り返し:
項目列: 項目列 項目
| 項目
;
ゼロ回以上の繰り返し:
項目列: 項目列 項目
|
;
「項目列 項目
」の代わり「項目
項目列
」も使えるが、bison
のスタックの長さが問題になる可能性
左結合の場合:
大式: 大式 左結合演算子 小式
| 小式
;
右結合の場合:
大式: 小式 右結合演算子 大式
| 小式
;
(優先度は 小式 > 中式 > 大式; 左結合の場合)
大式: 大式 演算子 中式
| 中式
;
中式: 中式 演算子 小式
| 小式
;
小式: 開括弧 大式 閉括弧
| 定数
;
bison
でのエラー処理error
トークンを含む規則を文法に追加可能statement: ... SEMICOLON { ... }(
| error SEMICOLON { yyerror("Statement error.\n"); yyerrok; }
yyerror
は自動呼出しなので、ここの呼出しが不要な場合も) error
トークンの含まれる規則までエラー前のトークンや非終端記号を無視error
トークンの後に来る入力も無視字句解析 (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)と簡単な計算機構造
(例: スタック・マシーン)
の場合、構文解析しながらのコード生成
(構文木を生成しない) が可能)