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