Разбор HTML в javacc
Я новичок в javacc и меня попросили расширить базовый html-разбор с использованием кода javacc. Мой вопрос - <script>
содержит много символов - таких как >
а также <
которые имеют другие определения. Например - if(indexOf("?")) > 3
, Я читал о лексических состояниях, но мало что понял.
Может ли кто-нибудь дать мне знать, как я могу иметь несколько определений для одного символа. Объяснение с примером действительно помогло бы мне.
И - действительно ли необходим анализ вышеупомянутого примера? Как вы игнорируете такие детали?
Кроме того, для человека, выполняющего основной анализ для поисковой системы, есть некоторые теги, такие как <style>
требуется? Если нет, то как вы полностью игнорируете теги в javacc?
1 ответ
Предположим, вы хотите, чтобы "<" и ">" были разрешены только в тегах и конечных тегах. За исключением того, что между <script>
а также </script>
теги, они должны быть разрешены. Следующие должны сделать это
// In default state, "<script>" changes to IN_SCRIPT state
TOKEN : { <SCRIPT_TAG : "<script>" > : IN_SCRIPT }
// In both states "</script>" is recognized and goes to DEFAULT state.
<*> TOKEN : { <END_SCRIPT_TAG : "<script>" > : DEFAULT }
// Other tags and end tags are only recognized in the default state.
TOKEN : { <OTHER_TAG : "<" (["a"-"z"])* ["/"] ">" > }
TOKEN : { <END_OTHER_TAG : "</" (["a"-"z"])* ">" > }
// Characters not in scripts, tags, or end tags
TOKEN : { <CHAR : ~["<",">"] }
// Characters in scripts
<IN_SCRIPT> TOKEN : { <CHAR_IN_SCRIPT : ~[] }
// Characters not allowed
TOKEN : { <UNEXPECTED_CHARACTER : ~[] }
Пропустите последнее правило, если вы хотите TokenManagerError
, а не ParseException
быть брошенным на меньшее и большее количество знаков, которые появляются там, где их не должно быть.
Этот ответ предназначен только для иллюстрации использования лексических состояний. Он не предназначен для отражения правил HTML относительно знаков "меньше" и "больше", которые я не знаю.