【问题标题】:The most efficient lookahead substitute for jflexjflex 最有效的前瞻替代品
【发布时间】:2019-07-24 11:14:40
【问题描述】:

我正在 jflex 中编写分词器。我需要将interferon-a 之类的词匹配为一个标记,将interferon-alpha 之类的词匹配为三个。

明显的解决方案是前瞻,但它们在 jflex 中不起作用。对于类似的任务,我编写了一个函数,在匹配的模式之后匹配一个额外的通配符,检查它是否是 java 代码中的空格,并在有或没有匹配字符串的一部分的情况下将其推回。

REGEX = [:letter:]+\-[:letter:]\.

从字符串interferon-alpha 匹配interferon-al。 然后,在 Java 代码部分中,它会检查匹配的最后一个字符是否是空格。不是,所以-al 将被推回并返回interferon

interferon-a 的情况下,空格将被推回并返回interferon

但是,如果匹配的字符串没有任何成功,则此功能不起作用。此外,它似乎很笨拙。因此,我想知道是否有任何“更好”的方法来确保以下字符是空格而不实际匹配并返回它。

【问题讨论】:

    标签: regex flex-lexer regex-lookarounds lexer jflex


    【解决方案1】:

    JFlex 当然有一个前瞻功能,与 (f)lex 相同。与 Java 正则表达式前瞻断言不同,JFlex 前瞻只能在匹配结束时应用,但在其他方面类似。在Semantics section of JFlex manual中有描述:

    在词法规则中,正则表达式r 后面可以跟一个前瞻表达式。前瞻表达式是$(行尾运算符)或/,后跟任意正则表达式。在这两种情况下,前瞻都不会被消耗,也不会包含在匹配的文本区域中,但在确定哪个规则具有最长匹配时会考虑 ...

    所以你当然可以写规则:

    [:letter:]+\-[:letter:]/\s
    

    但是,您不能将这样的规则放在宏定义中 (REGEX = …),正如手册中提到的那样(在 section on macros 中):

    右侧的正则表达式必须格式正确,并且不得包含^/$ 运算符。

    所以前瞻运算符只能在模式规则中使用。

    注意\s 匹配任何空白字符,包括换行符,而. 匹配任何换行符。我认为这就是导致您评论REGEX = [:letter:]+\-[:letter:]\.“如果匹配的字符串没有任何成功则不起作用”的评论(我猜你的意思是“没有任何成功在同一行,而且你打算写.而不是\.)。

    您可能(取决于您的语言)更愿意测试非单词字符,而不是测试后面的空格:

    [:letter:]+\-[:letter:]/\W
    

    或者将更精确的规范设计为一组 Unicode 属性,如 \W 的定义(也可在 JFlex 手册的链接部分中找到)。

    说了这么多,我想重复您my previous answer to a similar question 的建议:首先放置更具体的模式。例如,使用下面的一对模式将保证第一个模式选择带有单个字母后缀的单词,同时避免显式推回的需要。

    [:letter:]+(-[:letter:])?   { /* matches 'interferon' or 'interferon-a' */ }
    [:letter:]+/-[:letter:]+    { /* matches only 'interferon' from 'interferon-alpha' */ }
    

    当然,在这种情况下,您可以通过使用 {2,} 而不是 + 进行第二次重复,轻松避免第二个模式和第一个模式之间的冲突,但是依靠模式排序是完全可以的,因为它经常不方便保证模式不重叠。

    【讨论】:

    • 我不确定这是否是 Maven 问题,但我无法用 / 或 $ 编译任何东西 - 例如您的正则表达式会导致构建错误。这也是我认为 JFlex 不支持前瞻的原因。
    • @santiagonasar:你是对的,我的错。 JFlex 不允许在宏中使用/;我修复了示例并添加了注释。另请参阅答案末尾的新注释。
    猜你喜欢
    • 1970-01-01
    • 2010-10-04
    • 1970-01-01
    • 2019-07-21
    • 2015-05-10
    • 2021-11-18
    • 2020-02-05
    • 2013-11-09
    • 2017-11-21
    相关资源
    最近更新 更多