【发布时间】: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
使用了某种不同的技术:他们将&lt; 和>(以及</ 和/>)视为单独的标记,并在标签内使用GENERIC_ID 作为标记等。他们通常移动大部分解析器的工作。但是他们还必须更改标记器的上下文:他们在纯文本中使用不同的上下文,并且在标记中使用不同的上下文(但我认为他们忘记了属性值上下文,因为> 的第一次出现将在他们的词法分析器中结束标记) .
那么解析类 SGML 语言的最佳方法是什么?词法分析器真的在那里使用吗?如果是,哪些字符串构成了标记?
【问题讨论】:
标签: xml parsing tokenize lexer dfa