1 / 7

コンパイラ生成 系

コンパイラ生成 系. flex. 字句 解析器生成系 入力 ファイル: 字句定義、拡張子 .l lex.yy.c を生成(後述の yacc で include する) コンパイル: flex ファイル名. flex の書式. 定義部 %% ルール部 %% ユーザ 定義関数. 定義部 : ヘッダ ヘッダ:生成される C ファイルの先頭に挿入される 定義:正規定義(正規表現のマクロ定義) ルール部:字句の正規定義 int yylval は yacc から参照できるグローバル変数 { } 内に C コード記述、(含 return 文)

lemuel
Download Presentation

コンパイラ生成 系

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. コンパイラ生成系

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

  3. flexの書式 定義部 %% ルール部 %% ユーザ定義関数 定義部: ヘッダ • ヘッダ:生成されるCファイルの先頭に挿入される • 定義:正規定義(正規表現のマクロ定義) ルール部:字句の正規定義 • intyylvalはyaccから参照できるグローバル変数 • { }内にCコード記述、(含return文) • 字句の値をreturnし、yacc側でトークンとして読む ユーザ定義関数:上記Cコード内で利用する関数を記述

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

  5. yaccの書式 宣言部 %% ルール部 %% ユーザ定義関数 定義部: ヘッダ • ヘッダ:生成されるCファイルの先頭に挿入される • #include “lex.yy.c”もここで • main関数もここに書く • yyparse()を呼んで解析開始 ルール部:文法の規則(および評価値割り当て) • { }内にCコード記述 • Cコード内で評価値参照 • $$ ---- 左辺非終端記号の評価値(左辺値) • $n ---- 右辺n番目の記号の評価値 ユーザ定義関数:上記Cコード内で利用する関数を記述

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

  7. 練習課題(変数付き電卓) • calcを改造して • calc.lで代入の記号=と変数のトークンIDを追加 • calc.yで • 代入の構文 ID=式を追加し • 式の値を変数(IDの文字列名)に関連付けて記憶し • 式の中で変数が利用できるようにする

More Related