我需要在某些文字中计算“ab.
”,“ba.
”,“.ab
”的每次出现次数,其中“.
”(照例)除了换行符之外的任何字符。
我写道:
%%
ab. counter++;
ba. counter++;
.ab counter++;
%%
我的问题是,对于字符串:
abab
我的计数器等于1,它应该是3.它只匹配“ab”。 (ABA)。 我该怎么办?
答案 0 :(得分:1)
这就是flex的工作原理:它消耗已匹配的字符。在这种特定情况下,它与ab.
上的aba
匹配,使用这些字符,并且只在流中留下b
。
理论上,您可以尝试使用yyless(n)宏将字符放回到流中,该宏将除了前n个字符之外的所有字符都返回到流中。在你的情况下,yyless(2)(或者说yyless(yyleng-1))在所有规则中都会给你预期的结果。
或者,您可以使用/
超前运算符:a/(b.)
匹配,如果当前字符是“a”,后跟“b”和任何字符,而不实际消耗任何其他字符而不是“一个”。它是一个强大的工具,虽然我总是被告知/是危险的,应该避免(将必要的逻辑移到解析器上)。