什么是多字符串的正则表达式?
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 所做的那样),您就打开了未终止字符串可能性的大门,在这种情况下,在结束引号之前遇到换行符。如果字符串未正确关闭,文件末尾也会发生同样的情况。
如果您有单字符回退规则,它将识别未终止字符串的开始引号。这是不可取的,因为它会将字符串的内容扫描为程序文本,从而导致级联错误。如果您不尝试错误恢复,那没关系,但如果您这样做,通常最好至少识别换行符之前的未终止字符串,使用不同的模式。
我正在学习制作一个编译器,它有一些规则,比如单个字符串:
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 所做的那样),您就打开了未终止字符串可能性的大门,在这种情况下,在结束引号之前遇到换行符。如果字符串未正确关闭,文件末尾也会发生同样的情况。
如果您有单字符回退规则,它将识别未终止字符串的开始引号。这是不可取的,因为它会将字符串的内容扫描为程序文本,从而导致级联错误。如果您不尝试错误恢复,那没关系,但如果您这样做,通常最好至少识别换行符之前的未终止字符串,使用不同的模式。