【问题标题】:Regular expression for inline comment compiler construction [duplicate]内联注释编译器构造的正则表达式
【发布时间】:2017-03-25 23:23:38
【问题描述】:

我需要一个用于编译器词法分析器的 C 语言内联注释的正则表达式。 我试过这个ScreenShot 但它没有用,因为它消除了正则表达式。

Here is simplest code

【问题讨论】:

  • 请将您的代码作为文本发布在问题中。
  • 大部分部分消失,因为它包含很多 \\\\
  • 这是用于创建 Tokens 的简单 Lex 代码。
  • 可靠地处理 cmets 非常困难。理论上,您需要了解三元组(因为??/ 映射到反斜杠),但是像 GCC 这样的编译器默认会忽略它们,而 C++17 会消除它们。您还需要了解反斜杠换行规则;这些很重要,因为如果每行的最后一个字符是反斜杠,// cmets 可以继续到后续行。开始和结束注释符号也可以被反斜杠换行符打破。大多数情况下,您不会遇到这种深奥格式的 cmets,但编译器必须将它们全部考虑在内。
  • this answer 中有一个 flex 正则表达式,但@JonathanLeffler 的评论也是正确的;这取决于您在将输入输入到词法分析器之前是否处理过三元组和 \-newline 序列。

标签: c compiler-construction lex analyzer lexical


【解决方案1】:

为了捕捉 C 风格的 cmets,最好使用开始条件。 flex 示例,您可以找到 in documentation

有一个使用独占开始条件忽略 C stype cmets 的简单示例:

%x comment
"/*"         BEGIN(comment);
<comment>[^*\n]*        /* eat anything that's not a '*' */
<comment>"*"+[^*/\n]*   /* eat up '*'s not followed by '/'s */
<comment>"*"+"/"        BEGIN(INITIAL);

【讨论】:

  • 感谢您的回复,但我需要“//”内联 cmets 的正则表达式
  • 我的代码在块 cmets 上运行良好。为什么我需要使用这个(你的)方法?
  • 对于一行 cmets,您需要将正则表达式(类似于 "//".*\nbefore 规则忽略换行符 [ \t\n]+
  • @komar:没有必要将这两个规则按任何特定顺序排列,因为它们不能在输入中的任何点都匹配。此外,当然没有必要使用状态机来忽略块 cmets;一个简单的正则表达式就足够了。
猜你喜欢
  • 2020-05-02
  • 1970-01-01
  • 2014-07-26
  • 2014-12-17
  • 2011-08-21
  • 1970-01-01
  • 2014-01-29
  • 1970-01-01
  • 2012-10-26
相关资源
最近更新 更多