[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[debian-devel:12971] Re: TWM i18n
佐野@浜松です。
In <20000929093923C.kubota@xxxxxxxxxxxxxxxxxxxxx>,
on "Fri, 29 Sep 2000 09:35:46 +0900',
with "[debian-devel:12944] Re: TWM i18n",
Tomohiro KUBOTA <kubota@xxxxxxxxxxxxxxxxxxxxx> さん wrote:
> すでに patch@xxxxxxxxxxx に送ってしまったので、このパッチに対する
> 修正はあまりしたくないので。(それに、ソースを読んでもいまいち
> よくわからないです。 hogehoge.l というファイルは何なのでしょうか?)
".l" が付いているのは lex (GNU flex) のソースファイルですね。
flex lex.l すると lex.yy.c というファイルができます。
xmkmf して作った Makefile を使って (ちょっと細工が必要)
make lex.c すると flex -l -t lex.l >lex.c してますね。
man flex すると
解説
flex は スキャナを生成するためのツールです。ここで、スキャ
ナとは、テキスト内の字句パターンを解析するプログラムです。
flex は指定したファイル、もしくはファイル名が与え ら れ な
かった場合は標準入力から、作成するスキャナの記述を読み込み
ます。この記述は、正規表現と C コードのペアの形をとって い
ます。これは rules と呼ばれます。 flex は、出力として C ソ
ースファイルの lex.yy.c を作ります。これの中では、 yylex()
ルーチンが定義されます。このファイルはコンパイルされ、実行
形式を作成するために -lfl ライブラリとともにリンクさ れ ま
す。実行形式が走り始めると、正規表現をマッチさせるために入
力が解析されます。マッチするものを見つけると、対応す る C
コードが実行されます。
と書かれています。
In <20000930112845E.kubota@xxxxxxxxxxxxxxxxxxxxx>,
on "Sat, 30 Sep 2000 11:25:06 +0900',
with "[debian-devel:12952] Re: TWM i18n",
Tomohiro KUBOTA <kubota@xxxxxxxxxxxxxxxxxxxxx> さん wrote:
> ただ、自分でも何をやっているかよくわかっていないので、
> XFree86.org に送るのはいまいち気が進みません。
> (木下さんのパッチも、なぜこれがうまくいくのか、
> よく分かっていません。twmrc の読み込みのメカニズムそのものが
> わかってないので、当然といえば当然なのですが。
> yyparse() ってなに?ってな状態ですので...)
yyparse() は gram.y から
bison -y -d gram.y
mv -f y.tab.c gram.c
if [ -f y.tab.h ]; then set -x; mv -f y.tab.h gram.h; \
else exit 0; fi
によって生成される gram.c の中で定義されています。
GNU bison は yacc の高機能版ということになっているので
man yacc すると
解説
yacc は、 filename のファイルから文法仕様を読み取り、その仕様から LR(1)
パーサを生成します。パーサは、 LALR(1) 解析テーブルと、C 言語で書かれたド
ライバルーチンのセットから構成されています。 yacc は通常、 y.tab.c という
ファイルに解析テーブルとドライバルーチンを書き込みます。
と書かれています。
(何故か flex と lex では flex のほうにだけ日本語マニュアルがあって、
bison と yacc では yacc のほうにだけ日本語マニュアルがある。> potato)
flex(lex) と bison(yacc) の使い方は私もよくわかってませんが、
手元の "UNIX BLUE BOOK [ソフトウェア工房 UNIX]" (翔泳社刊,
ISBN4-88135-197-4, 「UNIX スーパーラーニングシステム」全 3 巻中
第 2 巻) だと p57-p139 あたりに解説があります。Kernighan & Pike な
"UNIX Programming Environment" だと第 8 章の "Program Development"
で説明されているみたいです (一応手元にあるけどまだじっくり読んだ
ことがない)。
問題の doinuput() は cflow parse.c gram.c lex.c | less してみると
1 ParseTwmrc {parse.c 172}
(skip)
7 doparse {parse.c 115}
8 yyparse {/usr/share/misc/bison.simple 249}
(skip)
16 yylex {lex.l 234}
(skip)
40 yy_get_next_buffer {lex.l 276}
41 yy_fatal_error ... {20}
42 doinput {lex.l 74}
という関係で使われているようです。御参考まで。
--
# (わたしのおうちは浜松市、「夜のお菓子」で有名さ。)
<kgh12351@xxxxxxxxxxx> : Taketoshi Sano (佐野 武俊)