多行注释 flex lex
Multi line comment flex lex
我正尝试在这种情况下进行多行评论:
- 以
'''
开始,以 '''
结束
- 里面不能正好包含三个
'''
,例子:
'''''' Correct
'''''''' Correct
'''a'a''a''''a''' Correct
''''''''' Incorrect
'''a'''a''' Incorrect
这是我的近似值,但我无法为此做出正确的表达:
'''([^']|'[^']|''[^']|''''+[^'])*'''+
简单的解决方案是使用开始条件。 (请注意,这并没有通过你所有的测试用例,因为我认为问题描述不明确。见下文。)
在下文中,我假设您想要 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 注释,因此没有先验理由相信换行符不是标记的一部分。
所以我随意选择了哪种解释。我本可以做出其他任意选择,但不同的示例将不起作用。
我正尝试在这种情况下进行多行评论:
- 以
'''
开始,以'''
结束 - 里面不能正好包含三个
'''
,例子:'''''' Correct '''''''' Correct '''a'a''a''''a''' Correct ''''''''' Incorrect '''a'''a''' Incorrect
这是我的近似值,但我无法为此做出正确的表达:
'''([^']|'[^']|''[^']|''''+[^'])*'''+
简单的解决方案是使用开始条件。 (请注意,这并没有通过你所有的测试用例,因为我认为问题描述不明确。见下文。)
在下文中,我假设您想要 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 注释,因此没有先验理由相信换行符不是标记的一部分。
所以我随意选择了哪种解释。我本可以做出其他任意选择,但不同的示例将不起作用。