我的正则表达式/ DFA的常规语法

时间:2015-01-14 17:40:40

标签: regex grammar dfa chomsky-hierarchy

我有以下正则表达式:((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

最诚挚的问候 帕特里克

1 个答案:

答案 0 :(得分:0)

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

X -> aY
X -> a,

其中X是任意非终端和任意终端。只有在任何右侧没有A -> eps的情况下才允许使用A规则。

<强>建筑

我们注意到正则表达式包含两种可能性,(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)*