2011-04-10 39 views
2

我需要lex中的正向lookbehind断言(flex 2.5.35)。在调查文件后,我没有看到直接的方法来做到这一点。它有一些类似于前瞻断言(r/s语法)的东西,但不是向后看。达到相同效果的最佳方式是什么?如何在lex中使用lookbehind断言?

这里有一个例子:假设我有我的扫描仪规格文件folling规则:

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

我将如何匹配“d”下一个“B”和“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 "); 

和一切都会很好,但法不支持此。

回答

0

你可能会用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 
+0

嗯,这看起来很复杂,但我想没有其他办法。 。 – justinrstout 2011-04-12 19:27:46

0

对于PCRE后面的语法的外表是这样的:

(?<= ...)用于正
(?<! ...)

而且PCRE需要固定长度的外表屁股(正或负)。

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

+0

的Flex目前不支持这些。资料来源:http://web.archive。org/web/20160525061545/http://flex.sourceforge.net:80/manual/Patterns.html – starbeamrainbowlabs 2017-10-30 12:00:46

+0

@starbeamrainbowlabs - 是的,为什么不说它是什么而不是它是什么?节省时间。我一直在避免lex,现在我知道我永远不会尝试使用它.. – sln 2017-11-03 19:21:50

+0

我不明白。我已经清楚地表明,据我所知,flex不支持这个功能 - 这不是flex的功能。我觉得我在这里错过了一些东西:-( – starbeamrainbowlabs 2017-11-03 21:11:56

1

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

  1. 反转你的字符串,并搜索你也倒转的模式。你的模式现在在它之前通常是什么。

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

否则,你应该发布一些例子字符串和你期望的结果,也许它可以实现而不使用后面的断言。