首页 > 解决方案 > 带有单引号或双引号的字符串的 Flex 正则表达式

问题描述

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

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

在此处输入图像描述

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

先感谢您!

标签: c++regexflex-lexerlexlexical-analysis

解决方案


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

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

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

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

.|\n       { return *yytext; }

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

为了:

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

只是一个建议。


推荐阅读