2015-04-24 3 views
1

Посмотрите на демонстрационный код для StreamTokenizer here. Кажется, что это не работает должным образом, когда в строке / (просто добавьте / между строкой в ​​StringReader). Вот код из упомянутой ссылки,Поведение StreamTokenizer для оператора деления "/"

StreamTokenizer tokenizer = new StreamTokenizer(
    new StringReader("Mary had 1 little lamb...")); 

    while(tokenizer.nextToken() != StreamTokenizer.TT_EOF){ 

     if(tokenizer.ttype == StreamTokenizer.TT_WORD) { 
      System.out.println(tokenizer.sval); 
     } else if(tokenizer.ttype == StreamTokenizer.TT_NUMBER) { 
      System.out.println(tokenizer.nval); 
     } else if(tokenizer.ttype == StreamTokenizer.TT_EOL) { 
      System.out.println(); 
     } 
    } 

Например, для строки "Mary had 1 little lamb...", выход

Mary 
had 
1.0 
little 
lamb... 

Для строки, "Mary had 1 /little lamb...", выход

Mary 
had 
1.0 
  • ли / работы как токен EOF? Если да, то почему?
  • Есть ли способ отличить / как другой токен, отличный от EOF.
+0

Кажется ОК для меня. Можете ли вы поделиться фрагментом кода, результатом, который вы получаете, и ожидаемым результатом? – Mureinik

+0

Что именно не работает? Примечание: ['StreamTokenizer'] (https://docs.oracle.com/javase/8/docs/api/java/io/StreamTokenizer.html) устарел. – Maroun

+0

Я отредактировал вопрос. Теперь вы можете найти более подробную информацию. – user148865

ответ

3

Согласно the documentation, / является комментарием характер в StreamTokenizer. Все, что приходит после него, пока EOL или EOF не будут проигнорированы и не будут обозначены.

Е.Г., чтобы продолжить пример вы дали, если строка "Mary had 1/2\n little lamb...", 2 закомментирована и не будет меток и лексический анализ возобновится после \n. Таким образом, результат будет:

Mary 
had 
1.0 
little 
lamb... 
+0

Почему downvote? – Mureinik

+0

@Mureinik Это очень хороший ответ приятель :). Может быть, ожидается, что downvoters будут больше (я не уверен, что) –

+0

@Mureinik: Каков предпочтительный способ, которым я могу разобрать и распечатать '/' как отдельный токен? Один из способов заключается в том, чтобы заменить '/' на некоторую строку, которая, как мы уверены, не войдет в исходную строку, а в условии if-else проверяет и заменяет эту конкретную строку на '/'. Но это не кажется элегантным. Есть ли лучший способ? – user148865

1

Просто Добавляя к выше ответа .Since / это символ комментария в StreamTokenizer и продолжаются до конца строки. Следовательно, вы должны добавить либо новую линию \n или \r в строке Так "Mary had 1/\n little /\nlamb..." или "Mary had 1/\r little/\rlamb..." оба будут работать для вас

Смежные вопросы