第五回: 中間テスト、flex の演習
2009 年 5 月 7 日
http://www.sw.it.aoyama.ac.jp/2010/Compiler/lecture5.html
© 2005-10 Martin J. Dürst 青山学院大学
flex
の概要flex
の使い方と演習全て同じ力を持って、お互いに変換可能、正規言語を定義・受理
字句解析 (lexical analysis)
構文解析 (parsing; syntax analysis)
意味解析 (semantic analysis)
最適化 (optimization)
コード生成 (code generation)
前半 (解析) もしくは全体は構文解析が中心
構文解析は getNextToken()
みたいな関数で字句解析から必要に応じて次のトークンを取得
構文解析は必要に応じて意味解析などを呼ぶ
主な要点:
選択肢:
ls
: ディレクトリの内容をリストアップmkdir
: 新しいディレクトリを作るcd
: 現在のディレクトリを変更するpwd
: 現在のディレクトリを表示するgcc
: C のプログラムをコンパイルする./a
: コンパイルしたプログラムを実行するnotepad filename.l &
: cygwin
からメモ帳を直接、しかも並行に使えるように立ち上げるC:\cygwin
C:\cygwin
の下しか見えないC:\cygwin\home\user1
pwd
で /home/user1
として表示C:\cygwin
の下からの脱出:cd /cygdrive/c
flex
の概要lex
の GNU 版、様々な拡張lex
: lexical analyzer (作者の名前は Lesk)bison
と相性がよいflex
の動作.l
で終わる flex 用入力ファイル ((f)lex
ファイル) を作成 (例: test.l
)flex
で test.l
ファイルから
lex.yy.c
ファイルを作成:flex test.l
lex.yy.c
を (他のファイルと一緒に)
コンパイルflex
の使い方main
から yylex()
関数を一回呼ぶ
構文解析から yylex()
を繰り返し読んで、トークンを return
で返すようにする
flex
の勉強の仕方flex
の出力 (lex.yy.c
) を読むflex
のソースを読む (flex
の字句解析も flex
形式で書かれている)flex
-v
)flex
の入力形式flex
専用の指示と C
プログラムの一部分が混在
主に、二つの %%
で区切られている三つの部分からなる:
その三つの部分の間に区切りとして %%
がある
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
の基本的動作.l
ファイル内の C 言語の部分をコピーflex
の演習 1前のスライドの flex
用プログラムをファイルにし、flex
と
gcc
を使って実行ファイルにし、実行してみる。
flex
の演習 2一般のテキストを XML
の要素の内容に入れたい場合には次の表に示される変換を行う必要がある。flex
でその変換と逆変換を行うプログラムをそれぞれ書く。
テキスト | XML |
' |
' |
" |
" |
& |
& |
< |
< |
> |
> |
flex
の演習 3: 数字の発見入力をそのまま出力、しかし数字でしたら、その前に
>>>
、その後に <<<
をつけるプログラムを flex
で作成
入力例:
abc123def345gh
出力例:
abc>>>123<<<def>>>345<<<gh
ヒント: 正規表現でつかんだ文字列は yytext
として使用可能
flex
の演習 4: 日付の字句解析提出期限と場所: 2010 年 5 月 20 日 (木) 19:00 まで O 棟 5 階の O-529 号室の前の箱に投入
提出形式:
flex
の入力になる .l
ファイル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 |
中間テスト