言語理論とコンパイラ

第五回: 字句解析ツール flex

2014 年 5 月 9 日

http://www.sw.it.aoyama.ac.jp/2014/Compiler/lecture5.html

Martin J. Dürst

AGU

© 2005-14 Martin J. Dürst 青山学院大学

今日の予定

前回までのまとめ

全て同じ力を持って、お互いに変換可能、正規言語を定義・受理

コンパイラの段階

字句解析 (lexical analysis)

構文解析 (parsing; syntax analysis)

意味解析 (semantic analysis)

最適化 (optimization)

コード生成 (code generation)

コンパイラの構造

字句解析の実装

主な要点:

選択肢:

字句解析の自動化

flex の概要

cygwin の使い方 (参考)

cygwin とハードディスク (参考)

flex の使用方法

flex の使い方

  1. 独自のファイル処理 (正規表現によるファイルの一部の認識・変更):

    main から yylex() 関数を一回呼ぶ

  2. 構文解析から呼ばれる字句解析:

    構文解析から yylex() を繰り返し呼んで、トークンを return で返す

今日の演習・宿題では 1.、授業の後半では bison とともに 2.を使用

flex の入力形式の一例

        int num_lines = 0, num_chars = 0;
%%
\n ++num_lines; ++num_chars;
. ++num_chars;
%%
main()
{
yylex();
printf( "# of lines = %d, # of chars = %d\n",
num_lines, num_chars );
}

int yywrap () { return 1; }

 

flex の演習 1

前スライドの flex 用プログラムを処理、実行

  1. flex の入力形式の一例」を test.l にコピー
  2. > flex test.llex.yy.c を作成
  3. > gcc lex.yy.ca.exe を作成
  4. > ./a <file でプログラムを実行

flex の入力形式の骨格

宣言など (C 言語)
宣言など (C 言語)
%%
正規表現 実行文 (C 言語)
正規表現 実行文 (C 言語)
正規表現 実行文 (C 言語)
%%
関数など (C 言語)
関数など (C 言語)

 

flex の入力形式の構造

flex 専用の指示と C プログラムの一部分が混在

主に、二つの %% で区切られている三つの部分からなる:

  1. 準備・設定部分:
    C の #include、グローバル変数の定義と初期化、良く使う字句の定義など
  2. 受理する正規表現 (字句規則) とその場合に実行するプログラムの断片
  3. 残りの C のプログラム (関数など)

C 言語そのものと違って、改行、字下げが解釈を左右

 

flex の勉強の仕方

flex の基本動作

 

flex の内部処理

flex の演習 2

一般のテキストを XML の要素の内容にする場合には次の表に示される変換が必要
flex で (その変換と) 逆変換のプログラムを作成

テキスト XML
' &apos;
" &quot;
& &amp;
< &lt;
> &gt;

flex の演習 3: 数字の発見

入力をそのまま出力、しかし数字でしたら、その前に >>>、その後に <<< をつけるプログラムを flex で作成

入力例:

abc123def345gh

出力例:

abc>>>123<<<def>>>345<<<gh

ヒント: 正規表現でつかんだ文字列は yytext として使用可能

flex の演習 4: 日付の字句解析

提出期限と場所: 2010 年 5 月 22 日 (木) 19:00 まで O 棟 5 階の O-529 号室の前の箱に投入

提出形式:

ISO 8601 は日付と時間の形式の標準 (Wikipedia 参照)。ファイル内に下記の形式の日付と時間を全て認識し、項目ごとに次のように出力する:

Year: 2014

Month: 5

Day: 9

Hours: 12

Minutes: 23

不可能な日付など (例: 2014-02-29) は無視するようにする。その他の形式 (日付と時刻の組合せ、期間、タイムゾーン) は発展問題。

形式 項目 実例
YYYY-MM-DD Year/Month/Day 2014-05-09
YYYY-MM Year/Month 2014-05
YYYY Year 2014
YYYY-DDD Year/Day 2014-094
YYYY-Www-D Year/Week/Day 2014-W15-3
HH:MM:SS Hours/Minutes/Seconds 12:23:47
HH:MM Hours/Minutes 12:23

 

flex でよく出る問題

宿題のヒント

来週の予定

中間テスト