Upload
lemuel
View
22
Download
0
Embed Size (px)
DESCRIPTION
コンパイラ生成 系. flex. 字句 解析器生成系 入力 ファイル: 字句定義、拡張子 .l lex.yy.c を生成(後述の yacc で include する) コンパイル: flex ファイル名. flex の書式. 定義部 %% ルール部 %% ユーザ 定義関数. 定義部 : ヘッダ ヘッダ:生成される C ファイルの先頭に挿入される 定義:正規定義(正規表現のマクロ定義) ルール部:字句の正規定義 int yylval は yacc から参照できるグローバル変数 { } 内に C コード記述、(含 return 文) - PowerPoint PPT Presentation
Citation preview
コンパイラ生成系
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 の文字列名)に関連付けて記憶
し• 式の中で変数が利用できるようにする