作者: 閑舎
日時: 2004/5/09(12:25)
"Bruce." <kbk@...> さん wrote.

> syntax error となっているように、確かに構文解析に失敗しています。//で
> 囲まれた正規表現の解析になぜか失敗していて、そのため後続する ',' でエ
> ラーになるという次第です。そこで、構文解析器を作り直したりしてみたので
> すが症状は変わりませんでした。
> #具体的にはbison → byaccに変えた
> 
> ここで、//ではなく""で囲ったものにしてやるとこれまたエラーが起こらなく
> なります。となると lexer が怪しいのですが、一見してそれらしい部分は
> 見当たりませんでした(当然といえば当然)。

はずれている可能性が高いですが、一応私の感じたことを一言。

以前、sgml パーサを使ってパースさせるスクリプトを書いていた時のことです。
パーサは国際文字集合を理解し、内部的には euc-jp と独自文字コードの変換表
を持って動作していました。ここで妙なことがあったのは \ (バックスラッシュ)
が \ と変換されたまま処理が終っていたことです。仕方なく、自分で

  $line =~ s/\n/\n/go;

のような処理を追加して何とかなっていました。japan.sgmldecl を見ても

-- This character set declaration is suitable for use with the ujis or
sjis coding systems.  It's probably rather easier to lie a bit. --

CHARSET
BASESET
"ISO Registration Number 1//CHARSET C0 set of ISO 646//ESC 2/1 4/0"
DESCSET     0    9   UNUSED
	    9    2   9
	   11    2   UNUSED
	   13    1   13
	   14   18   UNUSED

BASESET
"ISO Registration Number 14//CHARSET ISO 646 Japanese Version//ESC 2/8 4/10"
DESCSET
32 95 32
127 1 UNUSED

と、ここまで \ (92) を特別扱いする記述はありません。SJIS 部分も

BASESET
"ISO Registration Number 87//CHARSET JIS X 0208-1990//ESC 2/6 4/0 ESC 2/4 4/2"

DESCSET
41344 33 UNUSED
41377 94  8481  -- 41377 == 0xa1a1 == 0x2121 + 0x8080, i.e. ZenkakuKuhaku  --
41471  1 UNUSED
41600 33 UNUSED
41633 94  8737
41727  1 UNUSED
41856 33 UNUSED
41889 94  8993
41983  1 UNUSED
42112 33 UNUSED
...

というような感じで、普通に記されていました。James Clark 氏のパーサですの
で、フリーウェアのいろいろなところに広く影響を与えている可能性があります。
そんな感じで、Unicode がかんだ段階で / が特別扱いされてしまっているので
はないか、と感じたのですが……。

--
本田博通(閑舎)
テキストとスクリプトの http://rakunet.org/TSNET/