java - StreamTokenizer 行为

标签 java

我正在为实验室开发自己的解析器,并且在使用 StreamTokenizer 时遇到了一些奇怪的行为。似乎任何用单引号括起来的东西都会被跳过。

代码

StreamTokenizer st = new StreamTokenizer(new FileReader("input.txt"));
boolean eof = false;

do{
   int i = 0;
   int token = st.nextToken();
   switch (token){
       case StreamTokenizer.TT_EOF:
            System.out.println("EOF");
            eof = true;
            break;
       case StreamTokenizer.TT_EOL:
            System.out.println("EOL");
            break;
       case StreamTokenizer.TT_WORD:
            System.out.println("Word: " + st.sval);
            break;
       case StreamTokenizer.TT_NUMBER:
            System.out.println("Number: " + st.nval);
            break;
       default:
            System.out.println((char) token + " encountered.");
            break;

   }
} while (!eof);

输入:

top 'AT THE TOP' {
   l 2{ window{Open Up} } 
}

输出:

Word: top
' encountered.
{ encountered.
Word: l
Number: 2.0
{ encountered.
Word: window
{ encountered.
Word: Open
Word: Up
} encountered.
} encountered.
} encountered.
EOF

我注意到我可以使用以下方法设置引号字符:

st.quoteChar('\'');

我认为这将允许我设置引号字符,如果遇到,下一个标记将是直到下一个引号字符为止的所有内容。

不幸的是,这并没有像我想象的那样起作用,现在我陷入了困境。

最佳答案

javadoc

public int ttype

For a quoted string token, its value is the quote character.

sval文档说

When the current token is a quoted string token, this field contains the body of the string.

所以你需要有一个

case '\'':
  System.out.println("Quoted value is " + st.sval);
  break;

或类似于处理单引号字符串或重置语法的东西,这样它就不会将 ' 视为 quoteChar

关于java - StreamTokenizer 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23065434/

相关文章:

java - 如何使用 Selenium Webdriver 测试 WebElement 属性是否存在

java - 是否有明确定义的方法来衡量 XML 文件的大小和/或复杂性?

java - Jersey JAX-RS 1.0 请求未完成且客户端超时

java - 使用 equals() 计算数组中重复的字符串

java - 当类实现相同的接口(interface)时,Lambda 表达式会失败并出现 LambdaConversionException?

java - Android 静默发帖到 Facebook

java - 如果我无法使用注释 JsonTypeInfo 标记该类,如何自定义类的 json 包装键?

java - while 循环内的延迟不起作用

java - 静态计数(Android)

java - JUnit 测试方法无法返回值