[1759] Re:DIKSAM_book_0_4のLinuxでの実行結果について (その2)
投稿者:ICHIA
2011/12/22 03:10:54
追加情報になります。
diksam.l の動作について
SJIS対応の文字リテラルで関係のありそうな箇所(①~③)に、
printf()を入れてデバックしてみました。
①~③までの役割は以下の解釈であっているでしょうか?
①は、マルチバイト処理用、
SJISコードの漢字の範囲のコードが来たら2バイト単位で
リテラルに取り上げる所
②は、1バイト処理用
リテラル文字を1バイト単位でリテラルに取り上げる箇所
③は、②の続きで、
コンパイル時の指定文字コードがSJISだった場合、
2バイト目に0x5cを持つ可能性がある1バイト目が来た場合、
次の2バイト目も一緒にリテラルに吸上げる所
#########
<STRING_LITERAL_STATE>[\x81-\x9f\xe0-\xef][\x40-\x7e\x80-\xfc] {
①
dkc_add_string_literal(yytext[0]);
dkc_add_string_literal(yytext[1]);
}
<STRING_LITERAL_STATE><<EOF>> {
dkc_compile_error(dkc_get_current_compiler()->current_line_number,
EOF_IN_STRING_LITERAL_ERR,
MESSAGE_ARGUMENT_END);
}
<STRING_LITERAL_STATE>. {
Encoding enc = dkc_get_current_compiler()->source_encoding;
②
dkc_add_string_literal(yytext[0]);
if (enc == SHIFT_JIS_ENCODING
&& ((unsigned char*)yytext)[0] >= 0x81
&& ((unsigned char*)yytext)[0] <= 0x9e) {
③
BEGIN SHIFT_JIS_2ND_CHAR;
}
}
#########
”表”等の文字を入れても①③が表示されておらず、②ばかりでした。
自分の解釈からすると、日本語は①か③で処理されるはずだと
思っていましたが、どうも違っていました。
enc=SJISだと判定されていないのか?
SJIS文字コードは取得できていないのか?
どうしてそうなってしまうのか?
そこで、encの確認をしてみました。
③のIFの条件を、SJISだった場合と2バイト目が0x5c範囲を持つものと段階的にバラシて見ました。
####
if(enc == SHIFT_JIS_ENCODING){
④
if(((unsigned char*)yytext)[0] >= 0x81) &&
((unsigned char*)yytext)[0] <= 0x9e) ){
③
#####
④は表示されました。コンパイルのencは問題ないようです。
@そこで、solaris特有なのか?と思い、
このサーバにEUCコードの環境を作って動作させて見ました。
ちょっと手を加える必要がありましたが、動作しました。
test/test.dkm を動作させた所、「不正なマルチバイト」が出力されました。
お尻の「日本語」の部分をコメントにしたら、正常に動作しました。
更に、「日本語」を分解していき、「語」があると「不正なマルチバイト」になる事がわかりました。
また、exit(1)を削除して、最後の文字列を表示させてみたら同じく「不正なマルチバイト」になり、上記と同様にしたら「れ」が原因だと判明しました。
語: B8EC
れ: A4EC と2バイト目が"EC"で何かあるのでしょうか?0x5cの様なものが。
asciiコードの"EC"を見てもおかしくなるような感じはありませんでしたが・・・
以上が現在の調査状況になります。
なにか、ヒントがあればよろしくお願い致します。
相手をしてくれて感謝しております。