DOM树解析和语法树解析的区别是什么?

4

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

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

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

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


我的理解是DOM树(至少C#中MS提供的DOM树)是一棵树,但是带有相当大的块,例如“语句”作为叶子。由于这样的大块,人们可以在叶子上粗心大意,仍然可以做一些有用的工作(例如,“显示类图”,这已经被很好地建模了)。但是由于缺乏细节,您无法对代码进行深入的推理。 - Ira Baxter
你的意思是抽象语法树(AST)指的是语法树吗?解析这个词是否意味着严格的解析定义,例如解析上下文无关文法,还是解析有两种不同的含义,即解析HTML和解析文法? - Guy Coder
这里的语法树可以是抽象语法树(AST)或具体语法树。是的,“解析”HTML/XML与一般编程语言(如C/C++,Java)中的“解析”有不同的含义。 - JackWM
2个回答

1

感谢Ira Baxter和Guy Coder的关注。

我进行了一段时间的研究,并比较了这两种情况。我的印象是这样的:

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

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

附言:我不是专家,如果您发现我的理解有误,请随时提出评论。


浏览器用于 HTML 的 DOM 树将具体语法建模到每个标签。这本质上是 HTML 的语法树,但对于仅表示为文本块的嵌入式脚本语言则不是如此。请参见我的评论以获取 C# 程序可用的 DOM 树。 - Ira Baxter
似乎DTD(或XML模式)为您的特定XML文档指定了“额外语法”。但是,XML本身已经有了语法:开始和结束标记等。这使得XML非常灵活和可扩展。将其与JSON模式+ JSON数据和JSON自己的语法进行比较。 - CMCDragonkai

1

像其他语言一样,XML也有其语法规则。XML的语法规则相当简单(开始标签、结束标签、正确嵌套)。因此,语法树看起来也很简单(只是元素的层次结构)。XML模式是描述XML文件内容的另一个语法。

基本上,这是两个解析器依次调用。第一个验证所有的开始标签都有对应的结束标签,并且嵌套正确。

第二个解析器验证XML文件的内容是否按照模式(语法)结构化。例如,名为“B”的元素只能包含在名为“A”的元素中。

这与解析编程语言(如C)不同,因为您无法更改编程语言的语法。if语句只能出现在函数体内部,而不能出现在外部,您无法更改它。但是,在XML中,您可以通过指定XML文件内容的语法模式来指定“B”元素只能出现在“A”元素中,或者“A”元素只能出现在“B”元素中。


这是对XML“两级”语法的清晰陈述。此外,我们可以看出DTD中的正确嵌套隐式定义/要求。我认为DTD的功能有点像CFG。 - JackWM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接