7
ココココココココ 2017.07.03

コンパイラ生成 系

  • 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

Page 1: コンパイラ生成 系

コンパイラ生成系

2017.07.03

Page 2: コンパイラ生成 系

flex

• 字句解析器生成系• 入力ファイル: 字句定義、拡張子 .l• lex.yy.c を生成(後述の yacc で include す

る)• コンパイル: flex ファイル名

Page 3: コンパイラ生成 系

flex の書式

定義部: ヘッダ– ヘッダ:生成される C ファイルの先頭に挿入される– 定義:正規定義(正規表現のマクロ定義)

ルール部:字句の正規定義– int yylval は yacc から参照できるグローバル変数

– { } 内に C コード記述、(含 return 文)– 字句の値を return し、 yacc 側でトークンとして読む– トークン return 直前に yylval に書き込まれた値は yacc 側で

当該トークン評価時の値となる。ユーザ定義関数:上記 C コード内で利用する関数を記述

定義部%%ルール部%%ユーザ定義関数

Page 4: コンパイラ生成 系

yacc

• 構文解析器生成系• 入力ファイル:主に構文定義、拡張子 .y• y.tab.c を生成する• 字句解析器は flex の出力をインクルードす

る。– flex ライブラリをリンク

• コンパイル:  yacc  ファイル名

Page 5: コンパイラ生成 系

yacc の書式

定義部: ヘッダ– ヘッダ:生成される C ファイルの先頭に挿入される

• #include “lex.yy.c” もここで– main 関数もここに書く

• yyparse() を呼んで解析開始ルール部:文法の規則(および評価値割り当て)

– { } 内に C コード記述– C コード内で評価値参照

• $$ ---- 左辺非終端記号の評価値(左辺値)• $n ---- 右辺 n 番目の記号の評価値

ユーザ定義関数:上記 C コード内で利用する関数を記述

宣言部%%ルール部%%ユーザ定義関数

Page 6: コンパイラ生成 系

yacc 出力のコンパイル • cc y.tab.c –lfl #flex の場合• cc y.tab.c –ll #lex の場合

Page 7: コンパイラ生成 系

練習課題(変数付き電卓)• calc を改造して– calc.l で代入の記号 = と変数のトークン ID を

追加– calc.y で• 代入の構文  ID= 式を追加し• 式の値を変数( ID の文字列名)に関連付けて記憶

し• 式の中で変数が利用できるようにする