1

私は字句解析器を書いています。スイッチ構造があり、領域が発生する場所のコード スニペットを次に示します。

    //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 に評価し、出力に新しい行が作成されます。

4

2 に答える 2

2

MS Windows を使用していますか? はいの場合、Windows の最終行は です\r\n。しかし、Linux では、プログラムは問題ないはずです。

何もしない\r別のケースを追加して、キャラクターを無視する必要があります。\r

于 2013-03-29T21:17:48.050 に答える
0

ブームズの答えは正しいです。ケースが「\ r」の場合、空白の下に追加する必要がありました。

    //whitespace
    case ' ':
    case '\t':
    case '\r':
    case '\n':
        consume();
        break;

consumer() が行うことは別の文字を取得することだけであるため、ここでは他に何も行わないことに注意してください。

ありがとう。

于 2013-03-29T21:31:19.433 に答える