[英]Algorithm to generate context free grammar from any regex
任何人都可以為我概述一個算法,可以將任何給定的正則表達式轉換為一組等效的CFG規則嗎?
我知道如何處理基本的東西,如(a | b)*:
S -> a A
S -> a B
S -> b A
S -> b B
A -> a A
A -> a B
A -> epsilon
B -> b A
B -> b B
B -> epsilon
S -> epsilon (end of string)
但是,我遇到了一些問題,將其形式化為適當的算法,特別是對於可以具有許多嵌套操作的更復雜的表達式。
如果您只是從理論的角度討論正則表達式,那么有以下三種結構:
ab # concatenation
a|b # alternation
a* # repetition or Kleene closure
那么你可以做什么:
S -> (fullRegex)
fullRegex
每個重復項(x)*
,創建一個規則X -> x X
和X -> ε
,然后用X
替換(x)*
。 (a|b|c)
創建規則Y -> a
, Y -> b
和Y -> c
,然后更換(a|b|c)
與Y
簡單地重復這個(注意所有x,
a
, b
和c
仍然可以是復雜的正則表達式)。 請注意,您當然必須為每個步驟使用唯一標識符。
這應該足夠了。 這肯定不會給出最優雅或最有效的語法,但這就是規范化的目的(它應該在一個單獨的步驟中完成,並且有明確定義的步驟來執行此操作)。
一個例子: a(b|cd*(e|f)*)*
S -> a(b|cd*(e|f)*)*
S -> a X1; X1 -> (b|cd*(e|f)*) X1; X1 -> ε
S -> a X1; X1 -> Y1 X1; X1 -> ε; Y1 -> b; Y1 -> cd*(e|f)*
S -> a X1; X1 -> Y1 X1; X1 -> ε; Y1 -> b; Y1 -> c X2 (e|f)*; X2 -> d X2; X2 -> ε
... and a few more of those steps, until you end up with:
S -> a X1
X1 -> Y1 X1
X1 -> ε
Y1 -> b
Y1 -> c X2 X3
X2 -> d X2
X2 -> ε
X3 -> Y2 X3
X3 -> ε
Y2 -> e
Y2 -> f
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.