ドカタしながらCOMET II用アセンブラを30日で作る日記(4日目)

いやぁ、今日あたりから雨やら雪やらで天気が荒れるそうです。
その中仕事したくねぇよう。
昨日は、会社の近くのオンボロな家に引っ越してきた人がいるのですが、
その人の家に水道がないので、会社から引っ張っていたのですけど、
その水道が凍って水でないので、穴を掘って埋めました。
2、30mはあるのかなぁ。てえへんでした。


ちうことで、
文字列のレキサーがちゃんとできてなかったので作ってみます。<どういうことだ。

		case STRING:
			for (int i = 1; i < str.length; i++) {
				if (str[i] == '\'') {
					tokens ~= new Token(STRING, str[0 .. i]);
					str = str[i .. str.length];
					continue loop;
				}
			}
			throw new Error("not terminate string");
			break;

こんなんついか。テストはまだしてないのと、エスケープしてないよ。ってのが問題。
明日はエスケープするか。日記を書くとそれだけ時間潰れて悲しいけどしかたない。
では、会社に行ってきます。


追記、帰ってきて、飯食って、続きやろう、やろうと思いつつ寝る。
目が覚めたのでエスケープの仕様を調べて実装してみました。

			for (int i = 1; i < str.length; i++) {
				if (str[i] == '\'') {
					if (str.length > i + 1 && str[i + 1] == '\'') {
						continue;
					}
					tokens ~= new Token(STRING, str[1 .. i - 1].replace("''", "'"));
					str = str[i .. str.length];
					continue loop;
				}
			}

こんなかんじで実装完了。もしも'があったら次の文字を調べて'なら続ける'でなければ文字列終了で取り出した文字列の
''は'に置き換えると。それだけです。
文字列部分あとは、toStringの文字列のときの処理も追加しました。

		case STRING: return "'" ~ string.replace("'","''") ~ "'";