一个标记中的模式的多个匹配

时间:2013-12-16 16:44:39

标签: flex-lexer

我需要在某些文字中计算“ab.”,“ba.”,“.ab”的每次出现次数,其中“.”(照例)除了换行符之外的任何字符。

我写道:

%%

ab. counter++;
ba. counter++;
.ab counter++;

%%

我的问题是,对于字符串:

abab

我的计数器等于1,它应该是3.它只匹配“ab”。 (ABA)。 我该怎么办?

1 个答案:

答案 0 :(得分:1)

这就是flex的工作原理:它消耗已匹配的字符。在这种特定情况下,它与ab.上的aba匹配,使用这些字符,并且只在流中留下b

理论上,您可以尝试使用yyless(n)宏将字符放回到流中,该宏将除了前n个字符之外的所有字符都返回到流中。在你的情况下,yyless(2)(或者说yyless(yyleng-1))在所有规则中都会给你预期的结果。

或者,您可以使用/超前运算符:a/(b.)匹配,如果当前字符是“a”,后跟“b”和任何字符,而不实际消耗任何其他字符而不是“一个”。它是一个强大的工具,虽然我总是被告知/是危险的,应该避免(将必要的逻辑移到解析器上)。

但是,Flex并不是真的为此设计的。你最好用任何编程语言手动完成它。