K.Maebashi's BBS 投稿フォーム
ハンドル名
件名
Link
>追加情報になります。 > >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"を見てもおかしくなるような感じはありませんでしたが・・・ > >以上が現在の調査状況になります。 > >なにか、ヒントがあればよろしくお願い致します。 >相手をしてくれて感謝しております。 > > > > >
spamよけのため、ここに「ほげぴよ」と入力してください。
削除パスワード :
クリック!