我已经设法在我的Flex程序中有效地匹配了有效的字符串文本,但是我也希望用糟糕的转义序列来匹配未终止的字符串文本和字符串文本。
例如,使用简单正则表达式匹配字符串文本:
\"(\\.|[^\\"])*\"然后,我试图找出字符串文本是从哪里开始的,从"开始,然后是一些文本,然后是\n。对于我的lexer来说,这是不正确的语法,我想捕捉并生成一个错误输出。
我现在想出的方法是:
\"(\\.|[^\\"])*\n这样可以正确地捕获错误,但似乎占用了其余的令牌,因为之后没有输出。
此外,我还希望有一个特例错误时,一个未终止的字符串文字有一个无效的转义序列。例如:
"some text \
int abc因此,我的问题归结为,我目前的字符串文本匹配方式是否有问题,影响了我捕捉这些错误的能力,还是我的模式匹配不必要地消耗了令牌?也有可能我不知道自己在做什么!
字符串的一些示例:
"a correct string literal"
"an unterminated string literal
"an unterminated string literal with escape \所有字符串文本都是单行的,并遵循以下形式:
"(.*)"\n发布于 2021-09-02 01:11:53
字符串文字的正确的flex模式是(转义序列见下文):
\"(\\(.|\n)|[^\\"\n])*\"这与您的模式不同,因为它允许在转义字符之后使用换行符(从技术上讲,这是一个拼接,而不是字符串文本Note 1语法的一部分),否则禁止换行符。这必须显式地执行,因为[^...]包含一个换行符,除非\n是要拒绝的字符列表的一部分。只有.隐式禁止换行符。
若要匹配不正确的字符串文本,只需使用相同的模式而不需要终止"。
\"(\\(.|\n)|[^\\"\n])*您不需要担心匹配正确的字符串文本的模式,因为flex总是选择最长的匹配,并且使用终止引号的匹配肯定会更长。
如果您想更准确地了解转义字符,则需要如下所示:
\"(\\([abfnrtv'"?\\\n]|[0-7]{1,3}|x[[:xdigit:]]+|u[[:xdigit:]]{4}|U[[:xdigit:]]{8})|[^\\"\n])*\"您可以使用相同的技术来匹配错误,但是您可能希望区分未终止的引号错误和无效的转义错误,这可以通过使用两种错误模式来实现:
\"(\\([abfnrtv'"?\\\n]|[0-7]{1,3}|x[[:xdigit:]]+|u[[:xdigit:]]{4}|U[[:xdigit:]]{8})|[^\\"\n])*\" { /* Valid string */ }
\"(\\([abfnrtv'"?\\\n]|[0-7]{1,3}|x[[:xdigit:]]+|u[[:xdigit:]]{4}|U[[:xdigit:]]{8})|[^\\"\n])*/\\ { /* Invalid escape sequence */ }
\"(\\([abfnrtv'"?\\\n]|[0-7]{1,3}|x[[:xdigit:]]+|u[[:xdigit:]]{4}|U[[:xdigit:]]{8})|[^\\"\n])* { /* Missing terminating quote */ }备注
使用拼接在多行上继续字符串不是好的样式;最好使用字符串连接。但C标准确实允许。
但是,连接在标记化开始之前被移除,这意味着不能在行尾反斜杠转义反斜杠:
“这是一个字符串文本,它包含一个\t选项卡,在转义的中间有一个拼接。”
请不要在生产代码中使用,也不要使用:-)
https://stackoverflow.com/questions/69021061
复制相似问题