改行コード

やられました。まさかC++プログラムでこいつにぶち当たるとは・・・。
文字というのは、半角で1バイト、全角で2バイト使っています。半角はアルファベット全部と数字と)*^%といった記号の他に、タブや改行といったのも含まれます。興味ある人は適当なバイナリエディタで適当なテキストファイルを開いて覗いてみるといいでしょう。
で、ここで問題になるのがその改行の番号。バイナリエディタで覗くと改行の場所は何になっていますか?Windows上なら大抵は0D0Aになっているのではないでしょうか?1バイトじゃないのかよと思うのですけどなぜか2バイト。で、linuxだと0A、Macだと0Dに大抵なっていると思います。理由はよく知らないですけどなぜかOSによって改行コードが違うんですよ。
んで、字句解析やっててここで引っかかったんですね。いや、最初意味不明でしたよ。string型に直接代入した字句だとちゃんと解析できるのに全く同じ内容のファイルから読み出したらうまくいかなかったんだから。はい。原因はファイル読み込みにありました。
ファイルを読み込む場合、バイナリモードとテキストモードがあります。バイナリモードはバイナリエディタで覗いたような16進数のメモリをそのまんま読み込みます。一方、テキストモードは先程の改行コードを適切に変換して読み込みます。はい、これで原因は判りますよね。テキストDATAをバイナリモードで読み込んでいたんですね。
ちなみにテキストモードで読めるかどうかは不明。ファイルルーチンを作ったの私じゃないし。まあ改行コードぐらいなら頑張って自前で実装してもよいのだが。面倒だからCR+LF限定で行こうかと思案中。