代码之家  ›  专栏  ›  技术社区  ›  Nrj

使用JFlex代替Regex

  •  1
  • Nrj  · 技术社区  · 14 年前

    但是,我仍然不清楚下面的内容,同样需要澄清。

    1. 这与使用regex进行模式识别和数据分离有多大的不同?使用JFlex还有哪些额外的好处。

    2. JFlex比regex有用的任何特定用例。

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

    1 回复  |  直到 14 年前
        1
  •  8
  •   Community Lee Campbell    7 年前

    JFlex 不是解析器生成器,而是扫描生成器。它 CUP BYACC/J .

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

    您的问题:

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

    • 如果输入匹配 [0-9]+ (不同于 \. 然后它是一个无符号积分。发送 "INTEGER" 到输出。
    • [0.9]+\.[0-9]* 那么它就是一个无符号浮点。发送 "FLOAT"

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

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

    JFlex(和许多其他扫描器生成器一样)将允许您通过只提供regex(基本上)自动生成此类自动机的代码。并将生成非常有效的代码。

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

    顺便说一句,请记住 you cannot parse XML with Regex

    推荐文章