将上下文无关语法转换为正则表达式

2023-12-10

我目前正在查看 CFG 并看到答案,但我不确定他们是如何得到它的。他们是如何将其从 CFG 转换为正则表达式的?

S -> aS|bX|a
X -> aX|bY|a
Y -> aY|a


answer:
R.E -> (a*(a+ba*a+ba*ba*a))

你应该学习我在答案中写的基本规则“从正则表达式构造等效的正则语法”,这些规则将帮助您将“正则表达式转换为右或左线性语法”或“右或左线性语法转换为正则表达式” - 两者都可以。

不过,一种语言可以有多个正则表达式(和语法/自动机)。下面,我尝试解释如何查找教科书中问题的答案中给出的正则表达式。准确阅读每个步骤和链接的答案,以便您下次可以学习解决此类问题的方法。

第一步,要回答这样的问题,你应该清楚“这个语法生成什么语言?” (类似地,如果你有一个自动机,那么尝试理解该自动机代表的语言)。

As I said in linked answer, grammar rules like: S → eS | e are corresponding to "plus clouser" and generates strings e+. Similarly, you have three pairs of such rules to generate a+ in your grammar.

S → aS | a   
X → aX | a  
Y → aY | a    

(Note: a+ can also be written as a*a or aa* – describes one or more 'a'.)

另请注意,在语法中,您没有任何“空产生式”,例如A → ∧,所以非变量S, X or Y可以为空,这意味着空字符串不是语法语言的成员,如:ε ∉ L(G)。

如果您注意到起始变量S制作规则:

S → aS | bX | a

那么很明显,语言中的字符串 ω 可以以符号开头'a'或与'b'(因为您有两种申请选择S作品 (1)S → aS | a这给了'a'作为 ω 中的第一个符号,或 (2)S → bX用于生成以符号开头的字符串'b').

现在,L(G) 中可能的最小长度字符串 ω 是多少? – 最小长度字符串是"a"使用产生式规则可以实现:S → a.

接下来请注意"b"∉ L(G) 因为如果你苹果S → bX然后你必须更换X in 句子形式 bX使用一些X的产生式规则,正如我们所知X也不能为空,因此后面总是有一些符号'b'——换句话说,是感伤的bX推导∣ω∣ ≥ 2.

从上面的讨论中,很明显,使用S产生规则你可以生成句子形式a*a or a*bX,分两步:

  1. For a* use S → aS重复这将给S ⇝ a*S(符号∽表示多一步)

  2. Replace S右旋S ⇝ a*S得到要么通过a*a or a*bX

Also, "a*a or a*bX" can be written as S ⇝ a*(a + bX) or S ⇝ (a*(a + bX)) if you like to parenthesizes complete expression.

现在比较一下生产规则S and X两者都是一样的!正如我上面所示S,您还可以描述X它可以用来生成句子形式X ⇝ (a*(a + bY)).

导出答案中给出的正则表达式替换X by (a*(a + bY)) in S ⇝ a*(a + bX), 你会得到:

S ⇝ a*(a + b X )  
S ⇝ a*(a + b (a*(a + bY)) )

And now, last Y production rules are comparatively very simple - just use to create "plus clouser" a+ (or a*a).

所以让我们替换Y也在S派生句子形式。

S ⇝ a*(a + b(a*(a + bY)))   
  ⇝ a*(a + b(a*(a + ba*a)))

Simplify it, apply distribution low twice to remove inner parenthesis and concatenate regular expressions – P(Q + R) can be written as PQ + PR.

  ⇝ a*(a + b(a*(a + ba*a)))     
  ⇝ a*(a + b(a*a + a*ba*a))     
  ⇝ a*(a + ba*a + ba*ba*a)

: + in regular expression in formal languages use in two syntax (i) + as binary operator means – "union operation" (ii) + as unary superscript operator means – "plus clouser"
: In regex in programming languages + is only uses for "plus clouser"
: In regex we use ∣ symbol for union, but that is not exactly a union operator. In union (A ∪ B) is same as (B ∪ A) but in regex (A ∣ B) may not equals to (B ∣ A)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将上下文无关语法转换为正则表达式 的相关文章

  • JavaScript RegEx:不同的结果:使用字符串和使用正则表达式“文字”构建模式?

    使用 RegExp 文字与字符串之间有什么区别吗 http jsfiddle net yMMrk http jsfiddle net yMMrk String prototype lastIndexOf function pattern p
  • 使用基于正则表达式的部分匹配来选择 Pandas 数据帧的子数据帧

    我有一个 Pandas 数据框 它有两列 一列 进程参数 列 包含字符串 另一列 值 列 包含相应的浮点值 我需要过滤出部分匹配列 过程参数 中的一组键的子数据帧 并提取与这些键匹配的数据帧的两列 df pd DataFrame Proce
  • 解析西班牙姓氏

    西班牙姓氏由三部分组成 父亲的名字 可选的母亲姓名 可选配偶的父亲姓名 这三个部分中的每一部分都是一个单词 前面可能带有 De Del De La De Los 或 De Las 这些前缀中的每一个都以大写字母开头 并且每个部分可能只有一个
  • 正则表达式:删除 xml 的空元素标签

    我想将所有自封闭元素替换为长语法 因为我的网络浏览器在它们上绊倒 Example becomes 我正在使用 python 风格的正则表达式 这些解决方案都不会容纳像 foo gt 这样的属性 尝试 s lt w gt s gt lt 1
  • Perl 非贪婪

    我遇到非贪婪正则表达式 regex 的问题 我已经看到有关于非贪婪正则表达式的问题 但它们没有回答我的问题 Problem 我正在尝试匹配 lol 锚点的 href Note 我知道这可以通过 Perl HTML 解析模块来完成 我的问题是
  • 为什么我只得到第一个捕获组?

    https stackoverflow com a 2304626 6607497 https stackoverflow com a 2304626 6607497 and https stackoverflow com a 370042
  • Vim 搜索模式,如果出现则删除到行尾

    我正在尝试在文本文件中搜索特定模式 如果出现这种模式 则意味着该行的其余部分不需要 因此可以删除 我尝试过使用以下命令 但到目前为止还没有成功 s pattern d g pattern d 如果有人有任何建议 他们将不胜感激 would
  • hive regexp_extract 怪异

    我在 regexp extract 方面遇到一些问题 我正在查询制表符分隔的文件 我正在检查的列具有如下所示的字符串 abc def ghi 现在 如果我这样做 select distinct regexp extract name 0 f
  • Pandas系列矢量化文本处理

    我想使用矢量化操作改进我的 Pandas 代码 假设我有一个简单的 DataFrame 其中有一个文本列 其中可能包含 url Column1 0 hello http www google com 1 bye www mail com w
  • Python 正则表达式中的 \B+ 与 [\B]+ 与 [^\b]+

    我在回答 SO 问题时遇到了一个我不明白的问题 我创建了一个简化的示例来说明该问题 场景 我正在测试两个标记 不是随机的英语单词 在字符串中至少相距一定距离 在这个例子中 我们有一个动物列表 我们要确保在羊和狼之间至少还有其他三种动物 否则
  • javascript 和 PHP 中的正则表达式有什么区别吗?

    这是在 javascript 中验证电子邮件地址的正则表达式 我不确定是否可以直接在 PHP 中使用它 a z d u00A0 uD7FF uF900 uFDCF uFDF0 uFFEF a z d u00A0 uD7FF uF900 uF
  • Bash:单行命令以与 grep 命令相反的状态退出?

    如何减少以下 bash 脚本 grep P STATUS Perfect recess txt exit 1 exit 0 看起来我应该能够用一个命令来完成它 但我这里总共有 3 个命令 我的程序应该 阅读课间休息 txt 如果它包含 ST
  • 如何扩展路径中的波形符(~)[重复]

    这个问题在这里已经有答案了 我有一个 shell 脚本 可以从用户那里获取目录路径 但我需要检查目录是否为空 如果用户将他的主路径与 而不是绝对路径 所以我无法检查它ls echo Specify your project root dir
  • 删除PHP字符串中所有不匹配的字符?

    我有一个文本 我想从中删除所有不属于以下字符的字符 所需字符 0123456789 abcdefghijklmnopqrstuvwxyz n 最后一个是我确实想保留的 n 换行符 要匹配除列出的字符之外的所有字符 请使用反转字符集 http
  • 如何使用正则表达式验证带有可选百分比符号的小数?

    正如问题的标题 我需要使用以下值验证正则表达式 最多 2 个小数位和 9 个整数 带有可选的百分比符号 Valid 10 0 1111111 12 15 2 10 2 3 Invalid 12 02 123456789123 123 I t
  • 什么是上下文无关语法和巴科斯诺尔范式?

    有人可以用通俗的语言解释一下吗 什么是上下文无关语法 什么是巴科斯诺尔范式 如何使用这个记号 如何进行字符串推导 如何描述语言语法 上下文无关语法 CFG G 是一个四元组 V R S 其中 V 一组非终结符号 一组端子 V R 一组规则
  • 使用 preg_replace 仅替换第一个匹配项

    我有一个结构类似于以下的字符串 aba aaa cba sbd dga gad aaa cbz 该字符串每次都可能有点不同 因为它来自外部源 我只想替换第一次出现的 aaa 但其他人则不然 是否可以 可选的第四个参数预替换 http php
  • 提取部分字符串值,创建新的列名称,并使数据框宽

    我想提取字符串列的最后一部分 始终用方括号括起来 将它们作为新列的名称 然后将数据从长调整为宽 并用这些值填充新列 例如 如果我有这个数据框 whatihave lt data frame v1 c abc effort def effor
  • 捕获 XSS(跨站脚本)攻击的最佳正则表达式(Java 中)?

    杰夫实际上在净化 HTML http refactormycode com codes 333 sanitize html 但他的示例是用 C 编写的 而我实际上对 Java 版本更感兴趣 有人有更好的 Java 版本吗 他的示例是否足以直
  • 非回文的上下文无关语法

    我需要一个 CFG 来生成回文以外的字符串 已提供解决方案如下 计算理论导论 Sipser R gt XRX S S gt aTb bTa T gt XTX X

随机推荐