c - Flex 无法正确计算多行注释的行数

标签 c compiler-construction flex-lexer

我正在使用上面的正则表达式来识别 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;
    }
  }
}

关于c - Flex 无法正确计算多行注释的行数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25416437/

相关文章:

c++ - scanf() 不接受空格

c - C 中的 snprintf 问题

include - Bison/Flex 声明困惑......我应该如何在哪里包含/声明什么?

c++ - 编码 PHP 代码浏览器 : is Bison/Flex a choice?

java - 在 OSGi 中为 javax.tools.JavaCompiler 生成类路径的 final方法

unicode - Flex(词法分析器)对 unicode 的支持

c - 如何使用 libcurl 检查接收到的摘要信息

C编程: write to file without buffer

java - 默认 Maven 编译器设置

delphi - 可以禁用特定的 Delphi 提示吗?