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