解析器与词法分析器和 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,我们可以争论是否要为 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. 以上是关于解析器与词法分析器和 XML的主要内容,如果未能解决你的问题,请参考以下文章