flex正则表达式使用{ - }和尾随上下文

时间:2016-01-15 10:41:55

标签: flex-lexer

我正在处理嵌套的评论。我想一次跳过尽可能多的无关字符。但模式<COMMENT>[^\n]{-}\//\*{-}\*/\/是非法的。有什么建议吗?

更新
鉴于以下情况:

/**comment* text/**comment text**/comment*/

在捕获第一个/*后,它会进入COMMENT条件。现在我希望尽可能多地使用一个匹配字符(不是/**/)。由于flex选择了最长的匹配项,因此我不知道如何匹配孤立的*(不是*后跟/)和孤立的/ s。 \//\*不是一个字符类,因此我们无法计算它与另一个类之间的差异。

1 个答案:

答案 0 :(得分:0)

%%
"/\*"              { printf("OPEN_COMMENT [%s]\n", yytext); }
"\*/"              { printf("CLOSE_COMMENT [%s]\n", yytext); }
[^*/]+             { printf("TEXT [%s]\n", yytext); }
"\*"               { printf("TEXT [%s]\n", yytext); }
"/"                { printf("TEXT [%s]\n", yytext); }
%%

此处最长匹配规则有助于我们。想法是分别匹配独立的单个*/符号,而所有其他文本都是批量使用的(因此不会降低性能)。

以上示例的结果:

OPEN_COMMENT [/*]
TEXT [*]
TEXT [comment]
TEXT [*]
TEXT [ text]
OPEN_COMMENT [/*]
TEXT [*]
TEXT [comment text]
TEXT [*]
CLOSE_COMMENT [*/]
TEXT [comment]
CLOSE_COMMENT [*/]
TEXT [
]