Разница между синтаксическим анализом дерева DOM и синтаксическим анализом дерева?

После анализа файла HTML или XML мы можем получить дерево DOM.

После разбора C, C++ или JavaScript мы можем получить синтаксическое дерево.

Обратите внимание, что синтаксическое дерево построено на основе контекстно-свободной грамматики, которая определяет допустимую программу на C/C++/JS.

Но кажется, что дерево DOM - это просто иерархическая структура, заданная только файлом HTML/XML. Это правда? Это причина того, что проверка схемы была выполнена после анализа? В чем принципиальная разница между этими двумя видами деревьев разбора?

2 ответа

Решение

Как и любой другой язык, XML описывается грамматикой. Грамматика XML довольно проста (начальные теги, конечные теги, правильное вложение). Таким образом, синтаксическое дерево может показаться простым (просто иерархия элементов). Схема XML - это еще одна грамматика, которая описывает содержимое файла XML.

Так что в основном это два парсера, вызываемых друг за другом. Первый проверяет, что все начальные теги имеют конечный тег и что правильность вложенности.

Второй синтаксический анализатор проверяет, что содержимое файла XML структурировано в соответствии со схемой (грамматикой)... подобно тому, что элемент с именем "B" может содержаться только внутри элемента с именем "A".

Это не следует сравнивать с синтаксическим анализом языков программирования, таких как C, поскольку вы не можете изменить синтаксис языка программирования. Операторы if могут появляться только внутри функций, а не снаружи, и вы не можете это изменить. Однако в XML вы можете указать, что "B"-элементы могут появляться только в "A" -элементах, или "A" -элементы могут появляться только в "B"-элементах... все, указав грамматику содержимого вашего XML-файла в форме схемы.

Спасибо за интересы Айры Бакстер и Гая Кодера.

Некоторое время я снова искал и сравнивал эти два случая. Мое впечатление таково:

"Разбор" для XML может быть "проверяющим" или "не проверяющим". В последнем случае синтаксический анализатор не проверяет свой синтаксис по отношению к файлу определения типа документа (DTD). Этот синтаксический анализатор создает только иерархию элементов в файле XML. Так что это легче, чем "проверочный анализ".

"Разбор" для C/C++/Java генерирует синтаксическое дерево на основе его контекстно-свободной грамматики. Так что, неофициально, это больше похоже на "проверочный анализ".

PS: я не эксперт, поэтому приветствую любые комментарии, если вы считаете, что мое понимание неверно.

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