第五回: 中間テスト、flex の演習
2008年 5月 9日
http://www.sw.it.aoyama.ac.jp/2008/Compiler/lecture5.html
duerst@it.aoyama.ac.jp, O 棟 529号室
© 2005-8 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.llex.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提出期限と場所: 2008年5月22日 (木) 19:00 まで O棟5階のO529 号室の前の箱に投入
提出形式: flex の入力になる .l
のファイルを A4 の紙一枚 (必要になれば両面印刷;
もっと長くなる場合はホチキス止め)名前、学生番号はコメントとして書く。
入力ファイルに含まれる整数と浮動小数点数をカッチし、整数の場合に +10、浮動小数点数の場合に *100 にして、残りの文字をそのまま出力する。浮動小数点数の文法は C のものにする。
発展問題: C のコメントのようなものの中の文字を全て @ にする。