Я сейчас читаю об архитектуре компиляторов и парсеров, и меня интересует одна вещь ... Когда у вас есть XML, XHTML, HTML или любой язык на основе SGML, какова будет роль лексера em> а какие бы токены были?
Я читал, что токены похожи на слова, подготовленные для анализа с помощью лексера. Хотя у меня нет проблем с поиском токенов для строк языков C, C ++, Pascal и т. Д., Где есть ключевые слова, имена, литералы и другие словесные строки, разделенные пробелами, с XML у меня есть проблема, потому что их нет ни слова! Это всего лишь простой текст, перемежающийся разметкой (тегами).
Я подумал про себя, что, возможно, эти теги и фрагменты обычного текста являются токенами, что-то вроде этого: [TXT][TAG][TAG][TXT][TAG][TXT][TAG][TAG][TXT]...
. Это было бы вполне разумно, поскольку SGML не заботится о том, что находится внутри разделителей разметки <
и >
(ну, он распознает специальные инструкции обработки и определения, когда находит ?
или !
в качестве следующего символа; комментарии тоже относятся к этой группе), и токенизатор SGML может быть базой для парсера XML / HTML / XHTML.
Но затем я понял, что внутри разметки может быть <
символов как часть другого синтаксиса: значения атрибутов: - / Даже если не совсем хорошая идея помещать <
символов внутри значений атрибутов (для этого лучше использовать <
), многие браузеры и редакторы имеют дело с этим и рассматривают эти <
как часть значения атрибута, а не как разделитель тегов.
Это немного усложняет ситуацию, потому что я не вижу способа распознать подобную разметку простым детерминированным конечным автоматом (DFA) в лексере. Похоже, что для автомата требуется отдельный контекст, когда он находится внутри тега, и другой контекст, когда он встречает значение атрибута. Я думаю, для этого потребуется стек состояний / контекстов, поэтому DFA может не справиться с этим. Я прав?
Каково ваше мнение? Можно ли делать токены из тегов (разметки) и простого текста?
Здесь: http://www.antlr.org/wiki/display/ANTLR3/Parsing+XML
использует какую-то другую технику: они рассматривают <
и >
(а также </
и />
) как отдельные токены, а внутри тегов они используют GENERIC_ID
в качестве токена и т. Д. Они обычно перемещают большую часть работа парсеру. Но они также должны изменить контексты для токенизатора: они используют другой контекст в простом тексте и разную разметку (но они забыли о контексте значений атрибутов, я думаю, потому что первое появление >
завершит тег в их лексере).
Итак, каков наилучший подход к синтаксическому анализу SGML-подобных языков? Лексер там действительно используется? Если да, то какие строки составляют токены?