我怎样才能在lex中使用lookbehind断言?

时间:2011-04-10 22:11:27

标签: regex lex flex-lexer

我在lex中需要积极的lookbehind断言(flex 2.5.35)。在调查文档后,我没有看到直接的方法来做到这一点。它有类似于前瞻断言(r / s语法)的东西,但不是后瞻性的。达到同样效果的最佳方法是什么?

这是一个例子:假设我在扫描仪规范文件中有以下规则:

a         printf("matched a ");
b         printf("matched b ");
c         printf("matched c ");
d         printf("matched d ");

我如何匹配'b'后面的'd'和'b'本身,以便在'abd'的输入上得到:

matched a matched b matched d following b

但对于字符串'acd'

matched a matched c matched d

规则:

bd        printf("matched d following b ");

显然不起作用,因为它消耗了b;为'abd'输出:

matched a matched d following b

如果我有pcre lookbehinds,我可以写:

(?<=b)d   printf("matched d following b ");

一切都会好的,但是lex不支持这个。

3 个答案:

答案 0 :(得分:1)

如果你只有一个先行断言,我可以想到两种可能性。

  1. 反转您的字符串,并搜索您的倒置图案。通常在您的模式出现之前通常是什么。

  2. 我认为对于一些正则表达式的口味,可以从右向左解析,也许这可以帮助你和你的前瞻。

  3. 否则你应该发布一些示例字符串以及你期望的结果,也许它可以在不使用后面断言的情况下实现。

答案 1 :(得分:1)

您可以使用start conditions实现所需的功能,但代价是更复杂的扫描仪。启动条件允许您根据之前匹配的内容有条件地启用规则。这是一个例子:

%x matched_b
%%
<INITIAL,matched_b>{
    a       { printf("matched a\n"); BEGIN(INITIAL); }
    b       { printf("matched b\n"); BEGIN(matched_b); }
    c       { printf("matched c\n"); BEGIN(INITIAL); }
}

d       printf("matched d\n");
<matched_b>d    { printf("matched d following b\n"); BEGIN(INITIAL); }

使用此扫描仪我得到:

$ echo abcd | ./5615080
matched a
matched b
matched c
matched d

$ echo abdd | ./5615080
matched a
matched b
matched d following b
matched d

答案 2 :(得分:0)

对于pcre,语法背后是:

(?<= ... )为积极的 (?<! ... )否定

并且pcre需要固定长度看后面(正面或负面)。

如果lex拥有它们,它可能就是这种形式。