c - 使用 Flex 检测和跳过行注释

标签 c compiler-construction flex-lexer

我如何在 Flex 中检测像 // 这样的一行注释并跳过这些行?

此外,对于 /* 注释,以下代码片段是否足够?

   "/*"         { comment(); }
  %%

    comment()
    {
        char c, c1;
    loop:
        while ((c = input()) != '*' && c != 0)
            putchar(c);

        if ((c1 = input()) != '/' && c != 0)
        {
            unput(c1);
            goto loop;
        }

        if (c != 0)
            putchar(c1);
    }

最佳答案

为什么不直接使用正则表达式来识别评论? lex/flex 的全部意义在于让您不必手动编写词法扫描器。您提供的代码应该可以工作(如果您将模式 /* 放在行的开头),但它有点难看,而且它是否会工作并不明显。

你的问题说你想跳过评论,但你提供的代码使用 putchar() 来打印评论,除了开头的 /* 。你想做什么?如果您想回应评论,您可以使用 ECHO 操作而不是什么都不做。

这里是正则表达式:

单行注释

这很简单,因为在 lex/flex 中,. 不会匹配换行符。所以下面会匹配从//到行尾,然后什么都不做。

"//".*                                    { /* DO NOTHING */ }

多行注释

这有点棘手,而且 * 是正则表达式字符以及注释标记的关键部分这一事实使得以下正则表达式有点难以阅读。我使用 [*] 作为识别字符 * 的模式;在 flex/lex 中,您可以使用 "*" 代替。使用您认为更具可读性的任何一个。本质上,正则表达式匹配以 *(的字符串)结尾的字符序列,直到找到下一个字符为 / 的字符。换句话说,它与您的 C 代码具有相同的逻辑。

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

上面需要终止*/;未终止的注释将迫使词法分析器返回到注释的开头并接受一些其他标记,通常是 / 除法运算符。这可能不是您想要的,但要从未终止的评论中恢复过来并不容易,因为没有真正好的方法可以知道评论应该在哪里结束。因此,我建议添加错误规则:

[/][*][^*]*[*]+([^*/][^*]*[*]+)*[/]       { /* DO NOTHING */ }
[/][*]                                    { fatal_error("Unterminated comment"); }

关于c - 使用 Flex 检测和跳过行注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25395251/

相关文章:

c - 在下面的程序中,在函数 fun() 中添加一条语句,以便将 a 的地址存储在 j 中?

vb.net - Vb.Net 编译器是否可以打开 "Unreachable code"警告?

c - gcc 复杂常量折叠

javascript - 如何将json的上下文无关语法转换为状态机?

计算耗时

c - 在没有段错误的结构中使用指针

c - Flex - 在 C 中比较字符串的函数

grammar - Bison:单个规则中的可选标记

c++ - C 中的 Flex 在 64 位 Windows 7 计算机上编译时生成不受支持的 16 位应用程序

将子数组复制到另一个数组中