1

我是 JFlex 的新手。我收集到 JFlex 是一个解析器生成器。但是,我仍然不清楚以下内容,需要对此进行澄清。

  1. 这与使用正则表达式进行模式识别和数据隔离有什么不同,以及使用 JFlex 的额外好处是什么。

  2. JFlex 对正则表达式有用的任何特定用例。

  3. 它对一般解析有用吗,比如文本/xml 文件?

提前致谢。

4

1 回答 1

8

JFlex不是解析器生成器,而是扫描器生成器。它标记输入。将它与CUPBYACC/J等解析器生成器结合使用。

扫描器和解析器之间有一个重要区别:

你的问题:

1) 和 2) 假设您必须将输入的字符流转换为令牌流,给定以下模式:

  • 如果输入匹配[0-9]+(与\.下面的不同),那么它是一个无符号整数。发送"INTEGER"到输出。
  • 如果输入匹配[0.9]+\.[0-9]*,则它是一个无符号浮点。发送"FLOAT"到输出。

请注意,它们共享一个共同的前缀。如果您想使用正则表达式扫描输入,则必须将它们拆分为它们的公共前缀(除非您希望它非常慢,因为正则表达式很昂贵)。在运行时,您必须首先评估前缀,如果匹配,然后评估接下来的内容,如果^\.,您有一个积分并将重新开始,如果\.您必须评估以下文本是否是浮点数的尾数数字。如果是这样,您有一个FLOAT.

基本上,您必须构建一个有限状态自动机,其中状态是决策点并反映到目前为止看到的输入,而转换是对输入中看到的当前字符的评估。

JFlex(与许多其他扫描仪生成器一样)将允许您自动生成此类自动机的代码,只需提供正则表达式(基本上)。并将为其生成非常有效的代码。

3) 您可以同时使用生成的扫描器和生成的解析器来识别任何上下文无关语言。比如编程语言。虽然应该可以用它解析 XML(我从未尝试过),但特定用途的解析器通常用于 XML(例如SAXStAX等),因为 XML 具有众所周知的结构,因此不需要生成解析器

顺便说一句,请记住,您不能使用 Regex 解析 XML。;)

问候。

于 2010-10-06T20:51:23.047 回答