2015 年 5 月 8 日
http://www.sw.it.aoyama.ac.jp/2015/Compiler/lecture5.html
© 2005-15 Martin J. Dürst 青山学院大学
flex
の概要flex
の使い方と演習flex
, bison
, gcc
,
make
,m4
の動作確認済みノート PC
を持参全て同じ力を持って、お互いに変換可能、正規言語を定義・受理
字句解析 (lexical analysis)
構文解析 (parsing; syntax analysis)
意味解析 (semantic analysis)
最適化 (optimization)
コード生成 (code generation)
getNextToken()
のような関数で)主な要点:
選択肢:
flex
の概要lex
のオープンソース版、様々な拡張lex
: Unix 付属の字句解析器生成系
(作者の名前は Mike Lesk)bison
と相性がよいls
: ディレクトリの内容をリストアップmkdir
: 新しいディレクトリを作るcd
: 現在のディレクトリを変更するpwd
: 現在のディレクトリを表示するgcc
: C のプログラムをコンパイルする./a
: コンパイルしたプログラムを実行するC:\cygwin
C:\cygwin
の下しか見えないC:\cygwin\home\user1
pwd
で /home/user1
として表示C:\cygwin
からの脱出:cd /cygdrive/c
(MS Windows の C
ドライブのトップに移動)flex
の使用方法.l
の flex 用入力ファイル ((f)lex
ファイル) を作成 (例: test.l
)flex
で test.l
ファイルから
lex.yy.c
ファイルを作成:flex test.l
flex
が作成するファイルの名前は
lex.yy.c
lex.yy.c
を (他のファイルと一緒に)
コンパイルflex
の使い方main
から yylex()
関数を一回呼ぶ
構文解析から 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
用プログラムを処理、実行
flex
の入力形式の一例」を test.l
にコピーflex test.l
で lex.yy.c
を作成gcc lex.yy.c
で a.exe
を作成./a <file
でプログラムを実行flex
の入力形式の骨格宣言など (C 言語)
宣言など (C 言語)
%%
正規表現 実行文 (C 言語)
正規表現 実行文 (C 言語)
正規表現 実行文 (C 言語)
%%
関数など (C 言語)
関数など (C 言語)
flex
の入力形式の構造flex
専用の指示と C
プログラムの一部分が混在
主に、二つの %%
で区切られている三つの部分からなる:
#include
、グローバル変数の定義と初期化、良く使う字句の定義などC 言語そのものと違って、改行、字下げが解釈を左右
flex
の勉強の仕方flex
の出力 (lex.yy.c
) を読むflex
のソースを読む (flex
の字句解析も flex
形式で記述)flex
-v
)flex
の基本動作flex
呼び出し時:
.l
ファイル内の C 言語の断片のコピー.l
ファイルで先のものが優先flex
の内部処理.l
ファイルの最初のものだけを残すflex
の演習 2一般のテキストを XML
の要素の内容にする場合には次の表に示される変換が必要
flex
で (その変換と) 逆変換のプログラムを作成
テキスト | XML |
' |
' |
" |
" |
& |
& |
< |
< |
> |
> |
flex
の演習 3: 数字の発見入力をそのまま出力、しかし数字でしたら、その前に
>>>
、その後に <<<
をつけるプログラムを flex
で作成
入力例:
abc123def345gh
出力例:
abc>>>123<<<def>>>345<<<gh
ヒント: 正規表現でつかんだ文字列は yytext
として使用可能
flex
の演習 4 (宿題): XML の字句解析提出期限と場所: 2011 年 5 月 21 日 (木) 19:00 まで O 棟 5 階の O-529 号室の前の箱に投入
提出形式:
flex
の入力ファイル (.l
)一般の XML ファイルを入力して、その中のものを一行ずつ分かりやすいように書き出す。
例: (入力は <letter>Hello & World!</letter> の場合)
Start tag: <letter>
Contents: Hello
Entity: &
Contents: World!
End tag: </letter>
詳細:
flex
でよく出る問題.l
にエラーがあっても、flex
実行時にエラーは出にくい
対策: 毎回 flex
から処理し直す:
> flex file.l && gcc lex.yy.c && ./a
<input.txt
flex
の指示ではなく C
の部分は少なくとも空白一つ字下げが必要%%
以後は不要)int yywrap () { return 1; }
を忘れずyytext
で使えるputchar(yytext[0]);
(マッチした部分の一番目の文字を出力)\
でエスケープするか、""
で囲む必要がある中間テスト (30分)