解析器与词法分析器和 XML

Posted

技术标签:

【中文标题】解析器与词法分析器和 XML【英文标题】:Parser vs. lexer and XML 【发布时间】:2011-04-07 02:33:30 【问题描述】:

我现在正在阅读有关编译器和解析器架构的信息,我想知道一件事...... 当您有 XML、Xhtml、HTML 或任何基于 SGML 的语言时,词法分析器在这里的作用是什么?标记是什么?

我读过,标记就像 准备由 lexer 解析。虽然我在查找 C、C++、Pascal 等语言的标记方面没有问题,其中有关键字、名称、文字和其他由空格分隔的类似单词的字符串,但使用 XML 我有问题,因为没有没有任何话!它只是与标记(标签)交错的纯文本。

我心想,这些标签和纯文本片段可能是标记,类似于:[TXT][TAG][TAG][TXT][TAG][TXT][TAG][TAG][TXT]...。这是相当合理的,因为 SGML 不关心标记分隔符 <> 内的内容(好吧,当它发现 ?! 作为下一个字符时,它会识别特殊处理指令和定义;cmets也属于该组),SGML 标记器可以作为 XML/HTML/XHTML 解析器的基础。

但后来我意识到,作为其他语法的一部分,可以在标记中填充 < 字符:属性值:-/ 即使将 < 字符放入属性值中并不是一个好主意(最好使用<),许多浏览器和编辑器都会处理这个问题,并将这些<视为属性值的一部分,而不是标签分隔符。

这使事情变得有点复杂,因为我看不到通过词法分析器中的简单确定性有限自动机 (DFA) 来识别这样的标记的方法。当自动机在标签内时,它看起来需要一个单独的上下文,当它遇到属性值时需要另一个上下文。我认为这需要一堆状态/上下文,所以 DFA 可能无法处理。我说的对吗?

你有什么看法?用标签(标记)和纯文本制作标记好不好?

这里:http://www.antlr.org/wiki/display/ANTLR3/Parsing+XML 使用了某种不同的技术:他们将<>(以及<//>)视为单独的标记,并在标签内使用GENERIC_ID 作为标记等。他们通常移动大部分解析器的工作。但是他们还必须更改标记器的上下文:他们在纯文本中使用不同的上下文,并且在标记中使用不同的上下文(但我认为他们忘记了属性值上下文,因为> 的第一次出现将在他们的词法分析器中结束标记) .

那么解析类 SGML 语言的最佳方法是什么?词法分析器真的在那里使用吗?如果是,哪些字符串构成了标记?

【问题讨论】:

【参考方案1】:

构建了 XML 和 HTML 解析器,我有意见。

一般来说,词素应该是可识别的语言元素。

对于XML和HTML,这些基本对应

TAGBEGIN, 形式的事物 TAGEND,形式为 > TAGCLOSE, 形式 /> 形式的 TAGENDANDCLOSE(仅限 XML) ATTRIBUTENAME,NAME 的形式 EQUALSIGN,正好是 = ATTRIBUTEVALUE,是由属性表示的确切字符串的值,与引号无关(对于旧版 HTML,甚至没有引号)。如果属性中存在转义字符代码,则应将这些代码转换为其实际字符代码。 CONTENT,即 TAGEND 和 TAGBEGIN 之间的文本。和 ATTRIBUTEVALUS 一样,任何转义字符都应该被转换,因此 foo 之间的 CONTENT 被转换为文本 foo 如果您想将实体调用保留为单独的令牌,您可以这样做,在 TAGEND 和 TAGSTART 之间生成 CONTENT 和 ENTITYINVOCATION 令牌流;取决于您的目标是什么。

我们可以争论是否要为 HTML/XML cmets 生成令牌。如果你这样做,你就会这样做。

如果我们忽略 DTD 和 XML Schema 的复杂性,这就是您真正需要的。

词法分析器如何产生这些比较复杂;对于 XML 和 HTML,输入流中的转义有很多混乱,(如果我有这个权利)这只是一种有趣的引用,当 CONTENT 词位是时消失了产生。要处理所有这些,您需要一个非常复杂的词法分析器引擎。 是的,实际上,您需要不同的词汇状态(“模式”)来处理文本的不同部分。我几乎有一种主要模式来处理 ...> 里面的东西,还有一种主要模式来处理 CONTENT。

【讨论】:

感谢您非常快速和实质性的回复:) 嗯.. 听起来很合理。还有3个辅助问题:1.这是否意味着>ATTRIBUTEVALUE令牌中遇到时不会被视为TAGEND? 2. 这些额外的上下文状态与 NFA/DFA 理论有什么关系?它们被视为正常状态吗?还是一些更高级别的状态控制 DFA 操作? 3. 使用一个解析器来解析 SGML 标签并将其作为 XML/HTML/XHTML 解析器的令牌吐出不是更好吗?这是一个明智的做法吗? @SasQ: 1. 将产生标记 TAGBEGIN(值为 'FOO')、ATTRIBUTENAME(值为 'SIZE')、EQUALSIGN、ATTRIBUTEVALUE(值为 '> '), 标记。 2.“上下文状态”(我更喜欢称它们为词法模式)与 NFA/DFA 理论无关;您使用该理论这些状态中构建 FSA,以识别这些状态中允许的令牌。我们使用更高级别的状态机在词汇模式之间进行转换。 3. 当然,您可以根据需要嵌套或链接解析器;词汇模式技​​巧只是一个有趣的版本,然而,它是一个非常有效的版本。

以上是关于解析器与词法分析器和 XML的主要内容,如果未能解决你的问题,请参考以下文章

Postgres数据库词法分析和语法分析源码解析

Postgres数据库词法分析和语法分析源码解析

Postgres数据库词法分析和语法分析源码解析

如何实现词法分析器和解析器?

语言词法分析:一次或单独对字符串进行词法分析的性能更好?

在 Haskell 中使用 Alex 制作解析骰子卷的词法分析器