解析器 vs 词法分析器和XML

9
我正在研究编译器和解析器架构,想知道一个问题...当你有XML、XHTML、HTML或任何基于SGML的语言时,在这里词法分析器(lexer)的作用是什么,什么是记号(tokens)? 我读到过记号就像由词法分析器准备好的“单词”一样。虽然我可以轻松地为C、C++、Pascal等语言找到记号,因为它们具有关键字、名称、文字和其他类似单词的字符串,这些字符串由空格分隔,但对于XML,我有问题,因为没有任何单词!它只是与标记(tags)交织的纯文本。
我想,这些标记和纯文本片段可能就是记号,类似于这样:[TXT][TAG][TAG][TXT][TAG][TXT][TAG][TAG][TXT]...。这很合理,因为SGML不关心标记定界符<>内部的内容(当它发现下一个字符为?!时,它会识别特殊处理指令和定义;注释也属于该组),而且SGML分词器可以成为XML/HTML/XHTML解析器的基础。
但是,我意识到标记中可能会有<字符作为其他语法的一部分:属性值:-/即使在属性值中放置<字符不是一个好主意(最好使用&lt;),许多浏览器和编辑器也能处理并将这些<视为属性值的一部分,而不是标记定界符。
这使事情变得有点复杂,因为我看不到通过简单的确定性有限自动机(DFA)在词法分析器中识别这样的标记的方法。它似乎需要在标记内部时自动机的另一个上下文,以及在遇到属性值时的另一个上下文。我认为这需要一个状态/上下文堆栈,因此DFA可能无法处理。我对吗?
你怎么看?从标记(标记)和纯文本中制作记号是否好?
在这里:http://www.antlr.org/wiki/display/ANTLR3/Parsing+XML中使用了一种不同的技术:他们将<>(还有<//>)视为单独的记号,并在标记内部使用GENERIC_ID等记号。他们通常将大部分工作移到解析器中。但是他们还必须为记号生成器更改上下文:他们在纯文本和标记中使用不同的上下文(但我认为他们忘记了属性值上下文,因为第一次出现>将结束它们的记号生成器中的标记)。

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

1个回答

13

我曾经构建过XML和HTML解析器,我有自己的见解。

通常情况下,词元应该是可识别的语言元素。

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

  • TAGBEGIN,形式为<NAME
  • TAGEND,形式为>
  • TAGCLOSE,形式为</NAME>
  • TAGENDANDCLOSE,形式为/>(仅限XML)
  • ATTRIBUTENAME,形式为NAME
  • EQUALSIGN,确切地说是=
  • ATTRIBUTEVALUE,即属性表示的确切字符字符串的值,不考虑引号(甚至对于传统的HTML也是如此)。如果在属性中有转义字符代码,那么这些代码应该转换为它们的实际字符代码。
  • CONTENT,是TAGEND和TAGBEGIN之间的文本。与ATTRIBUTEVALUES一样,任何已转义的字符都应该被转换,因此 <B>foo&lt;bar</B> 之间的内容被转换为文本foo<bar。 如果您想将实体调用作为单独的标记保留,可以这样做,在TAGENDS和TAGSTARTS之间产生CONTENT和ENTITYINVOCATION令牌的流;这取决于您的目标。

我们可以争论是否要为HTML/XML注释生成标记。如果需要,则进行生成。

如果我们忽略XML中DTD和模式的复杂性,那么这就是您实际所需的全部内容。

词法分析器如何 产生 这些标记更加复杂; 对于XML和HTML,输入流中有很多乱七八糟的问题,如转义符号、<[CDATA[ ... ]]>(如果我没弄错的话),这只是一种有趣的引号,当CONTENT词元被产生时就会消失。要处理所有这些问题,您需要一个非常复杂的词法分析器引擎。

是的,实际上,要处理文本的不同部分,需要使用不同的词汇状态(“模式”)。我基本上有一个主要的模式来处理在<...> 内的内容,还有一个主要的模式来处理正文内容。


感谢您非常快速和实质性的回复 :)<br/> 嗯... 听起来很合理。对此还有三个辅助问题:
  1. 这是否意味着当在ATTRIBUTEVALUE标记内遇到>时,它不会被视为TAGEND
  2. 这些附加上下文状态与NFA / DFA理论有什么关系?它们是否被视为正常状态?还是一些控制DFA操作的更高级别状态?
  3. 使用一个解析器来解析SGML标记并将其作为XML / HTML / XHTML解析器的标记输出,这样做是否更好?这是一个明智的方法吗?
- SasQ
@SasQ:1. "<FOO SIZE=">">" 会产生标记 TAGBEGIN(值为“FOO”)、ATTRIBUTENAME(值为“SIZE”)、EQUALSIGN、ATTRIBUTEVALUE(值为“>”)和TAGEND。 2. “上下文状态”(我更喜欢称之为词法模式)与 NFA/DFA 理论无关;你可以在这些状态中使用该理论来构建识别这些状态中允许的标记的 FSA。我们使用一个更高级别的状态机来在词法模式之间进行转换。 3. 当然,如果您想,可以嵌套或链接解析器;词法模式技巧只是其有趣的一种形式,但它是非常有效的。 - Ira Baxter

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