言語理論とコンパイラ

第五回: 中間テスト、flex の演習

2009 年 5 月 7 日

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

Martin J. Dürst

AGU

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

今日の内容

前回までのまとめ

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

コンパイラの段階

字句解析 (lexical analysis)

構文解析 (parsing; syntax analysis)

意味解析 (semantic analysis)

最適化 (optimization)

コード生成 (code generation)

コンパイラの構造の実装

前半 (解析) もしくは全体は構文解析が中心

構文解析は getNextToken() みたいな関数で字句解析から必要に応じて次のトークンを取得

構文解析は必要に応じて意味解析などを呼ぶ

字句解析の実装

主な要点:

選択肢:

字句解析の自動化

cygwin の使い方

cygwin とハードディスク

flex の概要

flex の動作

flex の使い方

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

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

  2. 構文解析に:

    構文解析から yylex() を繰り返し読んで、トークンを return で返すようにする

flex の勉強の仕方

flex の入力形式

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

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

  1. 前文 (変数の定義と初期化、良く使う字句の定義など)
  2. 字句規則とその場合に実行するプログラムの部分
  3. そのほかの関数など

その三つの部分の間に区切りとして %% がある

flex の入力形式の骨格

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

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 の基本的動作

flex の演習 1

前のスライドの flex 用プログラムをファイルにし、flexgcc を使って実行ファイルにし、実行してみる。

flex の演習 2

一般のテキストを XML の要素の内容に入れたい場合には次の表に示される変換を行う必要がある。flex でその変換と逆変換を行うプログラムをそれぞれ書く。

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

flex の演習 3: 数字の発見

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

入力例:

abc123def345gh

出力例:

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

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

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

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

提出形式:

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

Year: 2010

Month: 5

Day: 7

Hours: 12

Minutes: 25

不可能な日付など (例: 2010-02-29) は無視するようにする。その他の形式は発展問題。

形式 項目 実例
YYYY-MM-DD Year/Month/Day 2010-05-07
YYYY-MM Year/Month 2010-05
YYYY Year 2010
YYYY-DDD Year/Day 2010-092
YYYY-Www-D Year/Week/Day 2010-W15-3
HH:MM:SS Hours/Minutes/Seconds 12:25:00
HH:MM Hours/Minutes 12:25

来週の予定

中間テスト