[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 (佐野 武俊)