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

Flex regular expression for strings with either single or double quotes

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

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

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

提前致谢!

(F)lex 确实没有任何机制可以接受两种不同类型的引号,除了将这两种模式与 | 放在一起。通常,只写多个模式更具可读性:

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

(上面的模式和你的模式之间的主要区别在于它遵循 C 规则:它不允许在引用的字符串中换行,但它允许“拼接”:由反斜杠和换行符组成的续行. 如果你的语言没有这些,你应该回到你原来的公式,但是连续行在编程语言中很常见。你需要永远记住的是 . 不匹配换行符,而 [^...] 除非明确排除换行符。)

但这还不够,因为它不会匹配未终止的引用文字。如果词法分析器看到引号然后尝试匹配未终止的文字,它将在行尾(或第一行 non-spliced 行的末尾)失败,并返回到初始引号。如果您遵循 fall-back 模式的常用技术,其中 returns 字符文字:

.|\n       { return *yytext; }

然后未终止的字符串将作为解析器不期望的标记字符发送到您的解析器;这将使产生有意义的错误消息变得困难,并且无法进行任何类型的错误恢复。

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

  • 避免走回头路,
  • 正确检测错误。

只是一个建议。