computer-science - 如何将正则表达式转换为 CFG?
问题描述
如何将正则表达式转换(ab*)*b
为上下文无关语法?
当我查找示例时,我一直在表达式中看到加号,但我没有。这只是一种不同的写作方式吗?
解决方案
您可以递归地应用以下规则,每个规则将单个正则表达式运算符更改为非终结符。(为每个运算符使用不同的非终结符名称。)在下面,R
和S
是正则表达式运算符的操作数的翻译;N
是这个运算符被翻译成的非终结符。终端简单地通过不变。
级联:
R S ⇒ N → R
交替:
R | S ⇒ N → R N → S
克莱恩明星:
R* ⇒ N → ε N → N R
克莱恩加:
R+ ⇒ N → R N → N R
可选的:
R? ⇒ N → ε N → R
例如,
Regex Transform Productions
(a b* )*b 3. b* ⇒ N1 N1 → ε
N1 → N1 b
( aN1 )*b 1. aN1 ⇒ N2 N2 → a N1
N2* b 3. N2* ⇒ N3 N3 → ε
N3 → N3 N2
N3b 1. N3b ⇒ N4 N4 → N3 b
推荐阅读
- pytorch - 将 pytorch float Sigmoid 结果转换为标签
- html - HTML 表单锁定上传的文件
- java - 我想使用流口水比较两个列表,但规则没有触发
- excel - 如何在整列中的 2 个字符(从右数)后加逗号?
- reactjs - 无法将 cypress 访问命令与创建反应应用程序一起使用
- javascript - reveal.js:无法请求全屏视频元素(Firefox,Chromium)
- postgresql - 尽管子查询很快,但 Postgresql 从行到 json 字符串的转换速度很慢
- python - datetime-local 在发布到烧瓶时返回 NoneType
- phpstorm - 如何在 PhpStorm Apache 2 PHP 7.4 上安装 Xdebug
- parsing - 如何在基于 flex/bison 的解析器中识别单个新行标记并忽略多个新行?