Sas*_*asQ 9 xml parsing tokenize lexer dfa
我现在正在阅读编译器和解析器架构,我想知道一件事......当你有XML,XHTML,HTML或任何基于SGML的语言时,词法分析器的作用是什么以及令牌是什么?
我读过,令牌就像为词法分析器准备的单词一样.虽然我没有找到用于语言行C,C++,Pascal等的令牌的问题,其中有关键字,名称,文字和其他由空格分隔的类似字符串的字符串,但是我有一个问题,因为它没有'任何话!它只是与标记(标签)交错的纯文本.
我心里想,可能是这些标签和纯文本片段都是令牌,类似的东西:[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
使用某种不同的技术:他们对待<和>(和</和/>)作为分隔标记,标签内,他们使用GENERIC_ID的令牌等他们通常将大部分工作转移到解析器上.但是他们还必须改变标记化器的上下文:它们在纯文本中使用不同的上下文,并且在标记中使用不同(但是他们忘记了属性值上下文我认为,因为第一次出现>将在标签中结束标记).
那么解析类似SGML的语言的最佳方法是什么?那个词法分析器真的用在那里吗?如果是,那么代币是什么字符串?
Ira*_*ter 12
构建了XML和HTML解析器后,我有了意见.
Lexemes一般应该是可识别的语言元素.
对于XML和HTML,这些基本上对应于
我们可以争论是否要为HTML/XML注释生成令牌.如果你这样做,那你就做了.
如果我们忽略DTD和Schema for XML的复杂性,那就是你真正需要的.
词法分子如何产生这些更复杂; XML和HTML,有很多具有与该输入流中逃脱做混乱的,<![CDATA ...]>(如果我有这个权利),这仅仅是一个有趣的一种报价和消失时,内容语义是产生的.要处理这一切,你需要一个非常复杂的词法引擎.是的,作为实际问题,你需要不同的词汇状态("模式"),以处理文本的不同部分.我几乎有一个主要模式来处理< ... >内的事情,以及一个主要模式来处理CONTENT.