我有以下正则表达式:((abc)+ d)|(ef * g?)
我已经创建了一个DFA(我希望它是正确的),你可以在这里看到
任务是创建一个常规语法(乔姆斯基层次结构类型3),我不明白。但我创建了一个常规语法,如下所示:
S→aT
T→b
T→c
T→dS
S→eT
S→eS
T→ε
T→f
T→fS
T→gS
最诚挚的问候 帕特里克
答案 0 :(得分:0)
Type 3 Chomsky是使用以下规则限制的常规语法类:
X -> aY
X -> a,
其中X是任意非终端和任意终端。只有在任何右侧没有A -> eps
的情况下才允许使用A
规则。
<强>建筑强>
我们注意到正则表达式包含两种可能性,(abc)+ d或ef * g ?,因此我们的第一个规则是S -> aT
和S -> 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)*