解析器与词法分析器和XML

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解析器的基础.

但后来我意识到<标记内部可能会有一些字符作为其他语法的一部分:属性值: - /即使将<字符放在属性值中也不是很好(最好用&lt;它),许多浏览器和编辑处理这些并将它们<视为属性值的一部分,而不是标记分隔符.

它使事情变得复杂,因为我没有看到通过词法分析器中的简单确定性有限自动机(DFA)识别标记的方法.看起来它需要一个单独的自动机上下文,当它在标签内时,另一个上下文遇到一个属性值时.这需要一堆状态/上下文我认为,所以DFA可能无法处理.我对吗?

你有什么看法?从标签(标记)和纯文本制作令牌是否合适?

在这里:http://www.antlr.org/wiki/display/ANTLR3/Parsing+XML
使用某种不同的技术:他们对待<>(和<//>)作为分隔标记,标签内,他们使用GENERIC_ID的令牌等他们通常将大部分工作转移到解析器上.但是他们还必须改变标记化器的上下文:它们在纯文本中使用不同的上下文,并且在标记中使用不同(但是他们忘记了属性值上下文我认为,因为第一次出现>将在标签中结束标记).

那么解析类似SGML的语言的最佳方法是什么?那个词法分析器真的用在那里吗?如果是,那么代币是什么字符串?

Ira*_*ter 12

构建了XML和HTML解析器后,我有了意见.

Lexemes一般应该是可识别的语言元素.

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

  • TAGBEGIN,<NAME形式的东西
  • TAGEND,形式>
  • TAGCLOSE,</ NAME>形式
  • 表格/>的 TAGENDANDCLOSE (仅限XML)
  • 属性名称的 ATTRIBUTENAME
  • EQUALSIGN,正是=
  • 的AttributeValue,即由一个属性,表示无论引号的(或甚至没有引号,用于遗留HTML)的确切字符串的值.如果属性中有转义的字符代码,则应将这些代码转换为实际的字符代码.
  • 内容,这是TAGEND和TAGBEGIN之间的文字.像ATTRIBUTEVALUES,任何转义字符应当被转换,所以之间的内容 <B> FOO<杆</ B>被转换成文本FOO <酒吧 如果要保持该实体调用作为单独的令牌,则可以做到这一点,从而产生TAGENDs和TAGSTARTs之间的内容和ENTITYINVOCATION令牌流; 取决于你的目标是什么.

我们可以争论是否要为HTML/XML注释生成令牌.如果你这样做,那你就做了.

如果我们忽略DTD和Schema for XML的复杂性,那就是你真正需要的.

词法分子如何产生这些更复杂; XML和HTML,有很多具有与该输入流中逃脱做混乱的,<![CDATA ...]>(如果我有这个权利),这仅仅是一个有趣的一种报价和消失时,内容语义是产生的.要处理这一切,你需要一个非常复杂的词法引擎.是的,作为实际问题,你需要不同的词汇状态("模式"),以处理文本的不同部分.我几乎有一个主要模式来处理< ... >内的事情,以及一个主要模式来处理CONTENT.