Flex不在多行注释上正确计算行数

我使用上面的正则表达式来识别Flex中的多行注释:

[/][*][^*]*[*]+([^*/][^*]*[*]+)*[/] { /* DO NOTHING */ } 

但在我看来,flex / bison没有正确返回线路计数器。 例如:

输入:

 1 ___bqmu7ftc 2 // _qXnFEgQL9Zsyn8Ohtx7zhToLK68xbu3XRrOvRi 3 /* "{ output 6 = <=W if u7 do nN)T!=$||JN,a9vR)7" 4 -758939 5 -31943.6165480 6 // "RND" 7 '_' 8 */ 9 [br _int] 

输出:

 1 TK_IDENT [___bqmu7ftc] 4 [ 4 TK_IDENT [br] 4 TK_IDENT [_int] 4 ] 

该行应为9而不是4。

有任何想法吗?

我不知道你是如何在你的问题中生成测试输出的,但这里是一个(几乎)如何使用yylineno最小例子。 这对我来说可以:

 %{ #define ID 257 %} %option yylineno %option noinput nounput noyywrap %% [[:space:]]+ { /* DO NOTHING */ } "//".* { /* DO NOTHING */ } [/][*][^*]*[*]+([^*/][^*]*[*]+)*[/] { /* DO NOTHING */ } [[:alpha:]_][[:alnum:]_]* { return ID; } . { return *yytext; } %% int main(int argc, char** argv) { for (;;) { int token = yylex(); switch (token) { case 0: printf("%4d: %s\n", yylineno, "EOF"); return 0; case ID: printf("%4d: %-4s[%s]\n", yylineno, "ID", yytext); break; default: printf("%4d: %c\n", yylineno, token); break; } } } 

这是我在Flex手册中找到的解决方案

记得声明int comment_caller; 在你的定义范围。

 %x comment %x foo %% "/*" {comment_caller = INITIAL; BEGIN(comment); } "/*" { comment_caller = foo; BEGIN(comment); } [^*\n]* {} "*"+[^*/\n]* {} \n {++line_num;} "*"+"/" BEGIN(comment_caller);