Flex正则表达式,用于带单引号或双引号的字符串

问题描述

我正在为一个词法分析器编写一个正则表达式。我目前有一个正则表达式,用于用双引号括起来的正则字符串,但是我的教授也希望我们也考虑单引号。

这是我当前的正则表达式:

enter image description here

我不确定如何让它接受两种。

提前谢谢!

解决方法

(F)lex实际上没有任何机制可以接受两种不同类型的引号,除了将两种模式与|组合在一起外。通常,编写多个模式更容易阅读:

["]([^"\\\n]|\\(.|\n))*["]   { /* A double-quoted string with escapes and splices */ }
[']([^'\\\n]|\\(.|\n))*[']   { /* A single-quoted string with escapes and splices */ }

(上述模式与您的模式之间的主要区别在于,它遵循C规则:不允许在带引号的字符串中使用换行符,但允许“拼接”:由反斜杠后跟换行符组成的行连续。如果您的语言没有这些,您应该回到原来的表述,但是续行在编程语言中很常见。您需要记住的始终是.与换行符不符,而{{1 }},除非明确排除换行符。)

但这还远远不够,因为它不匹配未终止的引用文字。如果词法分析器看到引号,然后尝试匹配未终止的文字,它将在行末(或第一条非拼接行的末尾)失败,并退回到初始引号。如果您遵循后备模式的通常方法,该方法会返回字符文字:

[^...]

然后,未终止的字符串将作为解析器不期望的令牌字符发送到解析器;这样将很难生成有意义的错误消息,并且无法进行任何类型的错误恢复。

通常最好添加后备未终止的字符串模式(与正确的模式相同,只是它们缺少终止引号),以便:

  • 避免回溯,并且
  • 正确检测到错误。

只是一个建议。