2010-07-14 97 views
1

我是JFlex的新手。我收集了JFlex是一个解析器生成器。 但是,我仍然不清楚以下内容,需要就此进行澄清。使用JFlex代替正则表达式

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

  2. 任何特定用途的情况下JFlex的是在正则表达式非常有用。

  3. 是它反正一般的分析是有用的,说的文本/ XML文件?

在此先感谢。

回答

8

JFlex不是一个解析器生成,但扫描仪生成。它标记了的输入。将它与解析器生成器(如CUPBYACC/J)结合使用。

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

您的问题:

1)和2)假设你有字符的输入流转换为给出以下模式标记流,:

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

需要注意的是,他们都有一个共同的前缀。如果你想用正则表达式扫描输入,你必须将它们分成它们的通用前缀(除非你想让它很慢,因为正则表达式很昂贵)。在运行时,你必须首先评估前缀,如果匹配,然后评估后面的内容,如果^\.,你有一个积分,并将重新开始,如果\.你将不得不评估如果下面的文本是尾数的一个浮点数。如果是这样,你有一个FLOAT

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

JFlex的(许多其他扫描仪发电机)将允许你自动生成这样的自动机的代码,只提供正则表达式(基本上)。并会为其生成非常高效的代码。

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

问候。

+0

谢谢mrrtnn,很好解释。 – Nrj 2010-10-07 17:10:02