Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 带单引号或双引号字符串的Flex正则表达式_C++_Regex_Flex Lexer_Lex_Lexical Analysis - Fatal编程技术网

C++ 带单引号或双引号字符串的Flex正则表达式

C++ 带单引号或双引号字符串的Flex正则表达式,c++,regex,flex-lexer,lex,lexical-analysis,C++,Regex,Flex Lexer,Lex,Lexical Analysis,我正在为类的词法分析器编写正则表达式。我现在有一个正则表达式,它是为带双引号的正则字符串编写的,但是我的教授希望我们也考虑单引号 下面是我当前的正则表达式: 我不确定如何让它接受这两种 提前谢谢你 (F)除了将两种模式与|放在一起之外,lex实际上没有任何机制可以接受两种不同类型的引号。通常,只编写多个模式更具可读性: [“]([^”\\\n]|\\(.|\n))*[“]{/*带转义和拼接的双引号字符串*/} [']([^'\\\n]\\(.\\n))*[']{/*带转义和拼接的单引号字符串*

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

下面是我当前的正则表达式:

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

提前谢谢你

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

[“]([^”\\\n]|\\(.|\n))*[“]{/*带转义和拼接的双引号字符串*/}
[']([^'\\\n]\\(.\\n))*[']{/*带转义和拼接的单引号字符串*/}
(上述模式与您的模式之间的主要区别在于,它遵循C规则:它不允许在带引号的字符串中使用换行符,但允许“拼接”“:由反斜杠和换行符组成的换行符。如果您的语言没有这些换行符,您应该返回原始公式,但换行符在编程语言中非常常见。您需要始终记住的是,
与换行符不匹配,而
[^…]
不适用,除非特别排除了换行符。)

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

.|\n       { return *yytext; }
然后,未终止的字符串将作为解析器不期望的标记字符发送给解析器;这将使生成有意义的错误消息变得困难,并且不可能进行任何类型的错误恢复

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

  • 避免倒退,以及
  • 正确检测错误

只是一个建议。

当简单的文本复制和粘贴就可以了时,请不要使用图像链接。图像很难阅读(尤其是在移动设备上),也不可能复制,这使得它们很难评论。