簡體   English   中英

從任何正則表達式生成上下文無關語法的算法

[英]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 XX -> ε ,然后用X替換(x)*
  • 每交替(a|b|c)創建規則Y -> aY -> bY -> c ,然后更換(a|b|c)Y

簡單地重復這個(注意所有x, abc仍然可以是復雜的正則表達式)。 請注意,您當然必須為每個步驟使用唯一標識符。

這應該足夠了。 這肯定不會給出最優雅或最有效的語法,但這就是規范化的目的(它應該在一個單獨的步驟中完成,並且有明確定義的步驟來執行此操作)。

一個例子: 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM