什么是多字符串的正则表达式?

What is regular expression for multi string?

我正在学习制作一个编译器,它有一些规则,比如单个字符串:

char ch[] ="abcd";

和多字符串:

printf("This is\
a multi\
string");

正则表达式是我写的

STRING \"([^\"\n]|\{NEWLINE})*\"

它适用于单行字符串,但不适用于一行以 '\' 字符结尾的多行字符串。 我应该改变什么?

常见的字符串模式是

\"([^"\\n]|\(.|\n))*\"

这将匹配包含转义双引号 (\") 和反斜杠 (\) 的字符串。它使用 \(.|\n) 允许反斜杠后的任何字符。虽然一些反斜杠序列比一个字符长 (\x40),但其中 none 在第一个字符后包含非字母数字。

您的输入可能包含 Windows 行结尾 (CR-LF),在这种情况下,反斜杠后面不会直接跟换行符;后面会有一个马车return。如果您想接受该输入而不是抛出错误(这可能更合适),您需要明确地这样做:

\"([^"\\n]|\(.|\r?\n))*\"

但是识别字符串和理解字符串代表什么是两件不同的事情。通常,编译器需要将字符串的表示形式转换为字节序列,例如,需要将 \n 转换为字节 10 并完全删除反斜杠换行符。

该任务可以使用启动条件在 (f)lex 扫描仪中轻松完成。 (或者,当然,您可以使用不同的词法扫描器重新扫描字符串。)

此外,您需要考虑错误处理。一旦您禁止带有未转义换行符的字符串(如 C 所做的那样),您就打开了未终止字符串可能性的大门,在这种情况下,在结束引号之前遇到换行符。如果字符串未正确关闭,文件末尾也会发生同样的情况。

如果您有单字符回退规则,它将识别未终止字符串的开始引号。这是不可取的,因为它会将字符串的内容扫描为程序文本,从而导致级联错误。如果您不尝试错误恢复,那没关系,但如果您这样做,通常最好至少识别换行符之前的未终止字符串,使用不同的模式。