我正在写一个词法分析器。我有一个开关结构,这是该区域所在位置的代码片段。

    //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;


因此,当它位于switch结构中时,似乎只是一个错误,而不是if或while语句。但是,如果我在默认情况下添加了一些东西来处理换行符,即使我打印出了外观,也求值(look =='\ n')为true,并且确实在输出中创建了新行。

最佳答案

您正在使用MS Windows吗?如果是,则Windows中的结束行为\r\n。但是在Linux中,您的程序应该可以。

您应该忽略\r字符,而为\r添加另一种情况则什么也不做!

09-11 20:46