1
8
JFlex 不是解析器生成器,而是扫描生成器。它 CUP 或 BYACC/J . 扫描器和解析器之间有一个重要的区别:
您的问题: 1) 2)假设您必须将输入字符流转换为令牌流,给定以下模式:
请注意,它们共享一个公共前缀。如果您想用正则表达式扫描输入,您必须将它们拆分为它们的公共前缀(除非您希望它非常慢,因为正则表达式非常昂贵)。在运行时,您必须首先计算前缀(如果匹配),然后计算后面的内容(如果匹配)
基本上你要建立的是一个 finite state automaton 其中状态是决策点,反映到目前为止看到的输入,而转换是对输入中看到的当前字符的评估。 JFlex(和许多其他扫描器生成器一样)将允许您通过只提供regex(基本上)自动生成此类自动机的代码。并将生成非常有效的代码。 3) 您可以同时使用生成的扫描器和生成的解析器来识别任何上下文无关的语言。例如编程语言。虽然应该可以用它来解析XML(我从未尝试过),但是特定用途的解析器通常用于XML(例如 SAX , StAX ,等等),因为XML有一个众所周知的结构,所以不需要 生成 解析器。 顺便说一句,请记住 you cannot parse XML with Regex
|