Parsing DOM树解析和语法树解析之间的区别?

Parsing DOM树解析和语法树解析之间的区别?,parsing,dom,schema,context-free-grammar,concrete-syntax-tree,Parsing,Dom,Schema,Context Free Grammar,Concrete Syntax Tree,解析HTML或XML文件后,我们可以得到DOM树 解析C、C++、JavaScript后,可以得到语法树。 注意,语法树是基于上下文无关语法构建的,上下文无关语法指定了有效的C/C++/JS程序 但DOM树似乎只是一个仅由HTML/XML文件指定的纯层次结构。这是真的吗?这就是在解析之后进行架构验证的原因吗?这两种解析树的根本区别是什么?感谢Ira Baxter和Guy Coder的兴趣 我重新搜索了一会儿,比较了这两个案例。我的印象是这样的: XML的“解析”可以是“验证解析”或“非验证解析”

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

解析C、C++、JavaScript后,可以得到语法树。 注意,语法树是基于上下文无关语法构建的,上下文无关语法指定了有效的C/C++/JS程序


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

感谢Ira Baxter和Guy Coder的兴趣

我重新搜索了一会儿,比较了这两个案例。我的印象是这样的:

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

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


PS:我不是专家,如果你发现我的理解不正确,欢迎发表评论。

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

所以基本上是两个解析器在彼此之后被调用。第一个验证所有开始标记是否都有结束标记,以及嵌套是否正确

第二个解析器验证XML文件的内容是否根据模式(语法)进行结构化。。类似地,名为“B”的元素只能包含在名为“A”的元素中


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

我的理解是DOM树(至少是MS为C#提供的一个)是一个树,但具有相当大的块,例如,作为叶的“语句”。有了如此大的块,人们可以随意使用树叶,仍然可以做一些有用的工作(例如,“显示类图”,建模得足够好)。但由于缺少细节,您无法对代码进行深入的推理。您是指语法树的抽象语法树(AST)吗?单词parsing是否意味着解析的严格定义,就像解析上下文无关语法一样,还是解析对解析HTML和解析语法有两种不同的含义?这里的语法树可以是抽象的(AST)或具体的。是的,HTML/XML的“解析”与一般编程语言(如C/C++)中的“解析”具有不同的含义,浏览器用于HTML的Java.DOM树为具体语法建模,一直到单个标记。这本质上是HTML的语法树,但不适用于只表示为文本块的嵌入式脚本语言。请参阅我对C#程序可用的DOM树问题的评论。DTD(或XML模式)似乎为特定的XML文档指定了“额外语法”。但是XML本身已经有了语法:开始和结束标记。。。这使得XML非常灵活和可扩展。将其与JSON模式+JSON数据和JSON自身的语法进行比较,这是XML“两级”语法的一个很好的表述。此外,我们可以看到DTD中隐式定义/要求正确的嵌套。我认为DTD的功能有点像CFG。