Разница между синтаксическим анализом дерева 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: я не эксперт, поэтому приветствую любые комментарии, если вы считаете, что мое понимание неверно.