多行注释 flex lex

Multi line comment flex lex

我正尝试在这种情况下进行多行评论:

这是我的近似值,但我无法为此做出正确的表达:

'''([^']|'[^']|''[^']|''''+[^'])*'''+

简单的解决方案是使用开始条件。 (请注意,这并没有通过你所有的测试用例,因为我认为问题描述不明确。见下文。)

在下文中,我假设您想要 return 匹配的标记,并且您正在使用 yacc/bison-generated 解析器,其中包括 char* str 作为联合类型之一。 start-condition 块是一个 Flex 扩展;在不太可能的情况下,您正在使用其他一些 lex 派生词,您需要每行写出一个模式,每个模式都带有 <SC_TRIPLE_QUOTE> 前缀(并且在该模式和模式之间没有 space ).

%x SC_TRIPLE_QUOTE

%%

'''        { BEGIN(TRIPLE_QUOTE); }

<TRIPLE_QUOTE>{
  '''      { yylval.str = strndup(yytext, yyleng - 3);
             BEGIN(INITIAL);
             return STRING_LITERAL;
           }
  [^']+    |
  ''?/[^'] |
  ''''+    { yymore(); }
  <<EOF>>  { yyerror("Unterminated triple-quoted string");
             return 0;
           }
}

我希望差不多 self-explanatory。开始条件中的四个模式匹配 ''' 终止符,除 ' 之外的任何字符序列,不超过两个 ',至少四个 'yymore() 导致累积相应的匹配项。对 strndup 的调用不包括定界符。

注:

上面的代码不会提供您对第二个示例的期望,因为我认为这是不可能的(或者,您需要更清楚两种可能的分析中哪一种是正确的,并且为什么)。考虑可能的评论:

'''a'''
'''a''''
'''a''''a'''

根据您的描述(和您的第三个示例),第三个应该与内部值 a''''a 匹配,因为 '''' 多于三个引号。但是根据你的第二个例子(稍作修改),第二个应该与内部值 ' 匹配,因为最后的 ''' 被视为终止符。问题是,应该如何区分这两种可能的解释?换句话说,在第二种情况下,词法扫描器有什么线索,令牌以 ''' 结尾,而在第三种情况下则没有?由于这两者都是输入流的一部分,因此后面可能有任意文本。由于这些是假定的 multi-line 注释,因此没有先验理由相信换行符不是标记的一部分。

所以我随意选择了哪种解释。我本可以做出其他任意选择,但不同的示例将不起作用。