c++ - 带有单引号或双引号的字符串的 Flex 正则表达式
问题描述
我正在为类的词法分析器编写正则表达式。我目前有一个为带有双引号的常规字符串编写的正则表达式,但是我的教授希望我们也考虑单引号。
这是我当前的正则表达式:
我不确定如何让它接受这两种。
先感谢您!
解决方案
(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; }
然后未终止的字符串将作为解析器不期望的令牌字符发送到您的解析器;这将使产生有意义的错误消息变得困难,并且不可能进行任何类型的错误恢复。
为了:
- 避免回溯,并且
- 正确检测错误。
只是一个建议。
推荐阅读
- unity3d - 如何在 Unity 中使用 Mirror 生成不同的预制件?
- wix - 当我们使用 WIX 将鼠标悬停在 .msi 文件上时如何显示版本号
- python - 无法从“utils”错误中导入模块
- python - `.venv` 在 Windows 下在 VSCode 中调试 Python 时被忽略
- android - keyGenerator 中的提供者和密钥名称
- ajax - 在 AJAX 请求中为时事通讯订阅表单设置结果消息(Shopware 6)
- node.js - Windows 10 - 尝试卸载或更改程序时出现错误代码 2330
- kubernetes - 未找到 terraform kubectl 提供程序
- c++ - 为什么 struc 中的 bool 成员不接受用户输入?
- c - 从外部远程更改参数值(如 XCP)