【问题标题】:Regular Grammar to my Regex/DFA我的正则表达式/DFA 的正则语法
【发布时间】:2015-01-14 17:40:39
【问题描述】:

我有以下正则表达式:((abc)+d)|(ef*g?)

我创建了一个 DFA(我希望它是正确的),您可以在此处查看

http://www.informatikerboard.de/board/attachment.php?attachmentid=495&sid=f4a1d32722d755bdacf04614424330d2

任务是创建一个常规语法(乔姆斯基层次结构类型 3),我不明白。但我创建了一个常规语法,如下所示:

S→aT

T→b

T→c

T → dS

S→eT

S → eS

T → ε

T→f

T → fS

T→gS

最好的问候 帕特里克

【问题讨论】:

  • 类型 3 Chomsky 不正是只允许规则 A -> aAA -> a 的常规语法类吗?如果是这样,这已经是乔姆斯基形式了……
  • 我不知道,就像我说的:我不明白......这就是我问的原因。
  • 你的 DFA 是正确的 :) 不要害羞使用许多非终端,有时你需要很多东西才能使正则表达式工作。
  • 非常感谢,您帮了大忙!
  • 很高兴,您可以通过接受答案来感谢我,如果您喜欢它,请(仅)投赞成票!

标签: regex grammar dfa chomsky-hierarchy


【解决方案1】:

Type 3 Chomsky 是限制使用以下规则的常规语法类:

X -> aY
X -> a,

其中 X 是任意非终结符和任意终结符。仅当 A 不存在于任何右侧时,才允许使用规则 A -> eps

建筑

我们注意到正则表达式包含两种可能性,或者 (abc)+d 或 ef*g?,因此我们的第一条规则将是 S -> aTS -> eP。这些规则允许我们开始创建两种可能性之一。请注意,非终结符必然不同,它们是相应自动机中完全不同的分离路径。接下来我们分别继续使用这两个正则表达式:

(abc)+ 我们至少有一个序列 abc 后跟 0 次或多次出现,不难看出我们可以这样建模:

S -> aT
T -> bU
U -> cV
V -> aT   # repeat pattern
V -> d    # finish word

ef*g? 这里我们有一个 e 后跟零个或多个 f 字符和一个可选的 g,因为我们已经有了第一个字符(前两个规则之一给了我们),我们继续这样:

S -> eP
S -> e    # from the starting state we can simply add an 'e' and be done with it,
          # this is an accepted word!
P -> fP   # keep adding f chars to the word
P -> f    # add f and stop, if optional g doesn't occur
P -> g    # stop and add a 'g'

结论

将它们放在一起,它们将形成该语言的语法。我试着把思路写下来,以便你理解。

作为练习,试试这个正则表达式:(a+b*)?bc(a|b|c)*

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-21
    • 2017-02-09
    • 2018-04-16
    • 2021-07-10
    • 2012-05-06
    • 2012-02-24
    • 2016-08-18
    • 1970-01-01
    相关资源
    最近更新 更多