私は字句解析器を書いています。スイッチ構造があり、領域が発生する場所のコード スニペットを次に示します。
//whitespace
case ' ':
case '\t':
case '\n':
consume(); System.out.println("consumed ws");
break;
//identifier
default:
if (isLetter()) {
consume();
state = 8;
} else {
System.out.println("invalid character: " + look);
}
break;
問題は、スペースとタブを正しく消費しますが、改行文字を消費せず、代わりにデフォルトになることです。
他の場所で '\n' との比較があり、正常に動作します。たとえば、行がコメント アウトされている場合、次のコードが実行されます。
case 10:
while(look != '\n'){
consume();
}
consume();
state = 0;
break;
したがって、if文やwhile文ではなく、switch構造にある場合は単なるエラーのようです。ただし、デフォルトのケースで改行を処理するために何かを追加すると、look を出力しても、(look == '\n') を true に評価し、出力に新しい行が作成されます。