Философия Java


StringTokenizer - часть 2


// не найдете одну из двух начальных элементов:

if(!token.equals("I") && !token.equals("Are")) continue; // В начала цикла while

if(token.equals("I")) { String tk2 = next(); if(!tk2.equals("am")) // Должно быть после Я

break; // Выход из цикла while

else { String tk3 = next(); if(tk3.equals("sad")) { sad = true; break; // Выход из цикла while

} if (tk3.equals("not")) { String tk4 = next(); if(tk4.equals("sad")) break; // Leave sad false

if(tk4.equals("happy")) { sad = true; break; } } } } if(token.equals("Are")) { String tk2 = next(); if(!tk2.equals("you")) break; // Должно быть после Are

String tk3 = next(); if(tk3.equals("sad")) sad = true; break; // Выход из цикла while

} } if(sad) prt("Sad detected"); } static String next() { if(st.hasMoreTokens()) { String s = st.nextToken(); prt(s); return s; } else

return ""; } static void prt(String s) { System.out.println(s); } } ///:~

Анализ происходит для каждой строки, происходит вход в цикл while и из строки извлекается значащий элемент. Обратите внимание, что первая инструкция if, которая командует continue (вернуться назад к началу цикла и начать его заново), если значащий элемент не является ни словом "I", ни “Are”. Это означает, что будут извлекаться значащие элементы до тех пор, пока не будет найдено “I” или “Are”. Вы можете решить, что нужно использовать == вместо метода equals( ), но этот оператор не будет работать корректно, так как == сравнивает значения ссылок, а метод equals( ) сравнивает содержимое.

Логика оставшейся части метода analyze( ) заключается в поиске шаблона, с которого начинается фраза “I am sad”, “I am not happy” или “Are you sad?”. Без использования инструкции break этот код был бы еще грязнее, чем он есть. Вы должны знать, что типичный синтаксический анализатор (это примитивный пример одного из них) обычно имеет таблицу таких значащих элементов и часть кода, проходящую по всем состояниям таблицы, после чтения каждого элемента.

Вы должны думать, что StringTokenizer является стенографическим упрощением для определенного вида StreamTokenizer. Однако если вы имеете String, которую вы хотите разбить на элементы, StringTokenizer является слишком ограниченным, все, что вам нужно сделать - это перевести строку в StringBufferInputStream, а затем использовать его для создания более мощного StreamTokenizer.




Начало  Назад  Вперед



Книжный магазин