lex - 在lex中,正规表达式 如何使用跟踪断言?

  显示原文与译文双语对照的内容

我需要 lex ( flex 2.5.35 ) 中断言的正面追溯。 在调查文档之后,我没有看到直接的方法来做这个。 它有类似于前置断言( 。R/s 语法)的东西,但不是追溯。 达到同样效果的最佳方法是什么?

下面是一个例子:我的扫描仪规范 file: 中有folling规则


a printf("matched a");


b printf("matched b");


c printf("matched c");


d printf("matched 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不支持这个。

时间: 原作者:

你可以用启动条件来实现你想要的东西,以更复杂的扫描仪为代价。 启动条件允许你根据先前匹配的条件有条件地启用规则。 以下是一个示例:


%x matched_b


%%


<INITIAL,matched_b>{


 a { printf("matched an"); BEGIN(INITIAL); }


 b { printf("matched bn"); BEGIN(matched_b); }


 c { printf("matched cn"); BEGIN(INITIAL); }


}



d printf("matched dn");


<matched_b>d { printf("matched d following bn"); 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



原作者:
...