コンパイラ生成 系
Post on 05-Jan-2016
22 Views
Preview:
DESCRIPTION
TRANSCRIPT
コンパイラ生成系
2017.07.03
flex
• 字句解析器生成系• 入力ファイル: 字句定義、拡張子 .l• lex.yy.c を生成(後述の yacc で include す
る)• コンパイル: flex ファイル名
flex の書式
定義部: ヘッダ– ヘッダ:生成される C ファイルの先頭に挿入される– 定義:正規定義(正規表現のマクロ定義)
ルール部:字句の正規定義– int yylval は yacc から参照できるグローバル変数
– { } 内に C コード記述、(含 return 文)– 字句の値を return し、 yacc 側でトークンとして読む– トークン return 直前に yylval に書き込まれた値は yacc 側で
当該トークン評価時の値となる。ユーザ定義関数:上記 C コード内で利用する関数を記述
定義部%%ルール部%%ユーザ定義関数
yacc
• 構文解析器生成系• 入力ファイル:主に構文定義、拡張子 .y• y.tab.c を生成する• 字句解析器は flex の出力をインクルードす
る。– flex ライブラリをリンク
• コンパイル: yacc ファイル名
yacc の書式
定義部: ヘッダ– ヘッダ:生成される C ファイルの先頭に挿入される
• #include “lex.yy.c” もここで– main 関数もここに書く
• yyparse() を呼んで解析開始ルール部:文法の規則(および評価値割り当て)
– { } 内に C コード記述– C コード内で評価値参照
• $$ ---- 左辺非終端記号の評価値(左辺値)• $n ---- 右辺 n 番目の記号の評価値
ユーザ定義関数:上記 C コード内で利用する関数を記述
宣言部%%ルール部%%ユーザ定義関数
yacc 出力のコンパイル • cc y.tab.c –lfl #flex の場合• cc y.tab.c –ll #lex の場合
練習課題(変数付き電卓)• calc を改造して– calc.l で代入の記号 = と変数のトークン ID を
追加– calc.y で• 代入の構文 ID= 式を追加し• 式の値を変数( ID の文字列名)に関連付けて記憶
し• 式の中で変数が利用できるようにする
top related