第五回: 中間テスト、flex の演習
2007年 5月 18日
© 2005-7 Martin J. Dürst 青山学院大学
flex
の使い方と演習ls
: ディレクトリの内容をリストアップmkdir
: 新しいディレクトリを作るcd
: 現在のディレクトリを変更するpwd
: 現在のディレクトリを表示するgcc
: C のプログラムをコンパイルする./a
:
コンパイルしたプログラムを実行するnotepad filename.l &
: cygwin
からメモ帳を直接、しかも並行に使える用に立ち上げるcygwin のインストール先が例えば C:\cygwin
だとすると、cygwin はまずそこの下しか見せない。
ユーザ用のホームディレクトリは
C:\cygwin\home\user1
とかで、pwd
で
/home/user1
として表示される。
C:\cygwin
の下から脱出したい場合には cd
/cygdrive/c
でできます。
(昔は cygdrive
は秘密でしたが、最近は見えるようになりました)
flex
の概要lex
の GNU 版、様々な拡張lex
: lexical analyzer (作者の名前は Lesk)bison
と相性がよいflex
の動作.l
で終わる flex 入力ファイルを作る
(例: test.l
)flex
で test.l
ファイルから
lex.yy.c
ファイルを作る:flex test.l
lex.yy.c
を (他のファイルと一緒に)
コンパイルするflex
の使い方main
から yylex()
関数を一回呼ぶ
構文解析から yylex()
を繰り返し読んで、トークンを返すようにする
flex
の勉強の仕方flex
の出力 (lex.yy.c
) を読むflex
のソースを読む (flex
そのものの字句解析は flex
形式で書かれている)flex
の入力の形式flex
専用の指示と 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
の演習 1前のスライドの flex
用プログラムをファイルに入力して、flex
と
gcc
を使って実行ファイルにして、試してみる。
flex
の演習 2一般のテキストを XML
の要素の内容に入れたい場合には次の表に示される変換を行う必要がある。flex
でその変換と逆変換を行うプログラムをそれぞろ書く。
テキスト | XML |
' |
' |
" |
" |
& |
& |
< |
< |
> |
> |
flex
の演習 3提出期限と場所: 2007年5月31日 (木) 19:00 まで O棟5階のO529 号室の前の箱に投入
提出形式: flex
の入力になる .l
のファイルを A4 の紙一枚 (必要になれば両面印刷;
もっと長くなる場合はホチキス止め)名前、学生番号はコメントとして書く。
C のプログラムの構文解析をするプログラムを作る。出力は授業で使った形式にし、適宜読みすいようにスペースや改行をいれる。
処理するトークンは以下の通り:
発展問題 (追加点): 追加のトークン類: 文字列定数、コメント