使用JFlex而不是Regex

时间:2010-07-14 18:14:04

标签: regex jflex

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

  1. 使用正则表达式进行模式识别和数据隔离与使用JFlex的其他好处有何不同。

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

  3. 对文本/ xml文件说一般解析是否有用?

  4. 提前致谢。

1 个答案:

答案 0 :(得分:8)

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

扫描仪和解析器之间存在重要差异:

您的问题:

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

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

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

基本上你需要构建的是finite state automaton,其中状态是决策点并反映到目前为止看到的输入,并且转换是对输入中看到的当前字符的评估。

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

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

顺便说一下,请记住you cannot parse XML with Regex。 ;)

问候。