Разбор 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 относительно знаков "меньше" и "больше", которые я не знаю.

Другие вопросы по тегам