StreamTokenizer行为

时间:2014-04-14 16:34:54

标签: 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('\'');

我认为这将允许我设置引号char,如果遇到,下一个标记将是下一个引用char之前的所有内容。

不幸的是,这并没有像我想的那样奏效,现在我被卡住了。

1 个答案:

答案 0 :(得分:3)

javadoc

public int ttype
     

对于带引号的字符串标记,其值为引用字符。

sval文档说

  

当前令牌是带引号的字符串标记时,该字段包含字符串的主体。

所以你需要一个

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

或类似的东西来处理单引号字符串或重置语法,因此它不会将'视为quoteChar