【发布时间】:2021-02-20 08:25:31
【问题描述】:
我正在使用 flex 来尝试匹配类似 C 的简化字符串文字。 这样的正则表达式:
\"([^"\\]|\\["?\\btnr]|\\x{HEXDIG}{HEXDIG})*\"
将匹配我感兴趣的所有单行字符串文字。
字符串文字不能包含非转义的反斜杠。字符串文字也不能包含文字换行符 (0x0a),除非它被反斜杠转义,在这种情况下,换行符和任何后续空格和制表符都将被忽略。。
例如,假设 {LF} 是一个实际的换行符,而 {TAB} 是一个实际的制表符(我没有比这更好的格式了)。
在:"This is an example \{LF}{TAB}{TAB}{TAB}of a confusing valid string"
令牌:"This is an example of a confusing valid string"
我的第一个想法是使用起始状态、尾随上下文和 yymore() 来匹配我想要的内容并检查是否存在错误,如下所示:
...
%%
\" { BEGIN STRING; yymore(); }
<STRING>{
\n { /* ERROR HERE! */ }
<<EOF>> { /* ERROR HERE AS WELL */ }
([^"\\]|\\["?\\btnr]|\\x{HEXDIG}{HEXDIG})* {
/* String ok up to here*/
yymore();
}
\\\n[ \t]* {
/*Vadid inside a tring but needs to be ignored! */
yymore();
}
\" { /* Full string matched */ BEGIN INITIAL;}
.|\n { \* Anything else is considered an error *\ }
}
%%
...
有没有办法按照我想做的方式做我想做的事?是否有任何其他可能由 flex 提供的“标准”方法,而我只是愚蠢地没有想到?在我看来,这并不像一个不常见的用例。我是否应该单独匹配字符串(从 before 开始,在空格结束之后)并将它们连接起来。这有点复杂,因为可以使用反斜杠将字符串分解为任意数量的行。
【问题讨论】:
-
如果你真的需要它是正确的,最好从 C 语言
flex词法分析器中获取你需要的所有功能,假设许可证允许的话。有几个边缘情况很棘手。
标签: c regex bison flex-lexer string-literals