【问题标题】:Difference between a DOM tree parsing and a syntax tree parsing?DOM 树解析和语法树解析的区别?
【发布时间】:2012-05-15 19:22:48
【问题描述】:

解析 HTML 或 XML 文件后,我们可以得到 DOM 树。

解析 C、C++ 或 JavaScript 后,我​​们可以得到语法树。

请注意,语法树是基于指定有效 C/C++/JS 程序的上下文无关语法构建的。

但似乎 DOM 树只是由 HTML/XML 文件指定的纯层次结构。真的吗?这就是解析后进行Schema Validation的原因吗?这两种解析树的根本区别是什么?

【问题讨论】:

  • 我的理解是 DOM 树(至少是 MS 为 C# 提供的)是一棵树,但具有相当大的块,例如“语句”作为叶子。有了这么大的块,人们就可以马虎地处理叶子,但仍然可以做一些有用的工作(例如,“显示类图”,它的模型已经足够好了)。但由于缺少细节,你无法对代码进行深入推理。
  • 您的意思是语法树的抽象语法树(AST)吗?解析这个词是否意味着解析的严格定义,就像解析上下文无关语法一样,或者解析对于解析 HTML 和解析语法有两种不同的含义?
  • 这里的语法树可以是抽象的(AST)或具体的。是的,HTML/XML 的“解析”与 C/C++、Java 等一般编程语言中的“解析”有不同的含义。

标签: parsing dom schema context-free-grammar concrete-syntax-tree


【解决方案1】:

与任何其他语言一样,XML 由语法描述。 XML 的语法相当简单(开始标签、结束标签、正确的嵌套)。所以语法树看起来也很简单(只是元素的层次结构)。 XML 模式是描述 XML 文件内容的另一种语法

所以基本上是两个解析器被一个接一个地调用。第一个验证所有开始标签都有一个结束标签并且嵌套是正确的。

第二个解析器验证 XML 文件的内容是根据模式(语法)构造的。就像名为“B”的元素只能包含在名为“A”的元素中。

这不应与解析 C 等编程语言相比,因为您无法更改编程语言的语法。 If 语句只能出现在函数体内,不能出现在函数体之外,而且您无法更改它。但是,在 XML 中,您可以指定“B”元素只能出现在“A”元素中,或者“A”元素只能出现在“B”元素中。所有这些都通过指定 XML 文件内容的语法来实现以模式的形式。

【讨论】:

  • 这是对 XML 的“两级”语法的一个很好的表述。此外,我们可以看到正确嵌套是在 DTD 中隐式定义/要求的。我认为DTD的功能有点像CFG。
【解决方案2】:

感谢您对 Ira Baxter 和 Guy Coder 的关注。

我重新搜索了一会儿,比较了这两种情况。我的印象是这样的:

XML 的“解析”可以是“验证解析”或“非验证解析”。对于后一种,解析器不会根据 文档类型定义 (DTD) 文件检查其语法。此解析器仅生成 XML 文件中元素的层次结构。所以它比“验证解析”更轻。

C/C++/Java 的“解析”基于其上下文无关文法生成语法树。因此,非正式地,它更像是“验证解析”。

PS:我不是专家,如果您发现我的理解不正确,欢迎任何 cmets。

【讨论】:

  • 浏览器用于 HTML 的 DOM 树对具体的语法进行建模,一直到各个标签。这本质上是 HTML 的语法树,但不适用于仅表示为文本 blob 的嵌入式脚本语言。请参阅我对 C# 程序可用的 DOM 树问题的评论。
  • DTD(或 XML 模式)似乎为您的特定 XML 文档指定了“额外语法”。但是 XML 本身已经有一个语法:开始和结束标记……等等。这使得 XML 非常灵活和可扩展。将此与 JSON 模式 + JSON 数据和 JSON 自己的语法进行比较。
猜你喜欢
  • 2011-08-23
  • 2011-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-20
相关资源
最近更新 更多