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

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 中获取两对方括号内的字符串 这是我的字符串 12 23 asd 到目前为止我尝试的是使用这种模式 d 我需要获得价值12使用正则表达式 您可以使用以下正则表达式 d 这将提取12 from
  • \d 只匹配0-9位数字?

    据我所知 d应该匹配非英文数字 例如 但它在 JavaScript 中不能正常工作 看这个jsFiddle http jsfiddle net xZpam http jsfiddle net xZpam 这是正常行为吗 JavaScript
  • Mercurial .hgignore 负向前瞻

    使用 Mercurial 我需要忽略除名为 keepers 的某个目录中的文件之外的所有文件 从表面上看 使用 Regex 和 Negative Lookahead 似乎很容易 然而 尽管我能够在 Regex Buddy 和其他工具中验证我
  • 在评论中查找不同风格的日期

    我还有一个问题要问preg match 我有一个表 其中评论的日期写在评论本身内 手动 现在我需要提取该日期并将其放置在不同的列中 我发现评论和日期的样式如下 id warning sent warning date 6109 2011 0
  • Ruby 字符串上的扫描和匹配有什么区别

    我是 Ruby 新手 并且一直使用String scan搜索某个数字第一次出现的位置 返回值在嵌套数组中有点奇怪 但我只是去了 0 0 为了我想要的价值观 我确信它有它的用途 只是我还没有使用它 我刚刚发现有一个String match方法
  • 如何从 php 中的字符串中删除 unicode 字符 (LEFT_TO_RIGHT_MARK)

    我试图在将字符串编码为 JSON 之前从字符串中删除从左到右标记 u200e 和从右到左标记 u200f 以下两者似乎都不起作用 s mb ereg replace u200e s s preg replace u200e u s s pr
  • 排除正则表达式匹配中的字符串,以进行 sed 处理

    我需要将其匹配为替代命令 whatever MATCH THIS whateverwhatever AND THIS whateverwhatever 我正在尝试 sed e s 1 g myfile 但这是急切的匹配 MATCH THIS
  • 捕获长字符串上的特定字段[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有点卡在这里 我正在努力解析一些如下所示的信息 CouchDB 数据库内容 rows id AGO key AGO value re
  • 使用 regEx 验证属性名称

    我想使用点表示法规则 任何字母或数字以及 and 只要它不以数字开头 显然如果使用括号表示法那么一切都是有效的 我一直在尝试找出正则表达式解决方案 但我对正则表达式的了解并不多 我认为我当前的模式将允许字母 数字 and 但我不知道如何禁止
  • javascript 正则表达式用于空格或

    我正在寻找一个用于空白的 javascript 正则表达式 我正在循环中检查几个不同的字符串 我需要找到其中有大空白的字符串 空白字符串构建在一个循环中 就像这样 请将此代码阅读为var whitespace nbsp 然后循环只是在其上连
  • Javascript 替换为正则表达式无法正常工作

    我正在尝试使用正则表达式验证名称 正则表达式阻止用户连续输入 2 个空格或点 这是我的代码 function test input var regex A Za z 0 1 s 0 1 input value input value rep
  • JavaScript 使用正则表达式验证电话号码

    问候溢出者 我正在尝试编写一个正则表达式来验证 10 位数字 形式的电话号码 即 以下情况是有效的 1231231234 或 1111111111 无效的情况是少于 10 位或多于 10 位的数字字符串 到目前为止我的表达是这样的 d 10
  • 在 sed 中插入换行符 (Mac OS X)

    如何在 sed 的替换部分插入换行符 此代码不起作用 sed s 1234 n 1 g input txt gt output txt 其中 input txt 是 test1234foo123bar1234 和output txt应该是
  • 如何创建仅接受字母数字字符的正则表达式? [复制]

    这个问题在这里已经有答案了 可能的重复 字母数字和下划线的正则表达式 https stackoverflow com questions 336210 regular expression for alphanumeric and unde
  • 哪些字符可以用作正则表达式分隔符?

    哪些字符可以用作 Perl 正则表达式的分隔符 m re m re and m re 一切似乎都有效 但我想知道所有可能性 From perlop http perldoc perl org perlop html 通过 m 您可以使用任意
  • 使用正则表达式验证字符串是否安全

    我有一个网站 用户可以在其中选择用户名 目前 他们可以输入几乎任何字符 包括 ETC 我知道我可以使用正则表达式 这可能就是我的选择 我将使用否定集 我认为这是正确的工具 如下所示 那么 我怎样才能知道要放入该集合中的所有非法字符呢 我可以
  • 音乐和弦部分拆分正则表达式

    这是此问题的后续问题 用于匹配音乐和弦的正则表达式 https stackoverflow com questions 11229080 regex for matching a music chord 是我问的 现在我有一个正则表达式来知
  • URL 的正则表达式

    我已经编写了正则表达式来验证 URL 它可以是这样的 example com www example com http www example com http www example com https www example com h
  • 如何突出显示 html 文档中文本查询的搜索结果而忽略 html 标签?

    我有一个字符串 其中包含 html 内容 像这样的东西 const text My name is Alan and I span an span div class someClass artist div 我使用以下命令在反应组件中渲染
  • 当 vbscript.regexp 工作时,VBA RegExp 会导致编译错误

    我正在为 Outlook 2013 的 VBA 编写一个脚本 它使用正则表达式 我发现的每个示例似乎都使用Set regex New RegExp创建一个正则表达式对象 当我尝试这个时 我得到了编译错误 用户定义类型未定义 我设法使用正则表

随机推荐