簡體   English   中英

如果給出了語言定義,如何生成無限制語法

[英]How to generate an Unrestricted grammar if a language defination is given

如何構造生成 L = {a^ib^jc^k^d^l: i not equal to k AND j not equal to l} 的無限制文法。

a 是 i 的冪,'b' 是 j 的冪,'c' 是 k 的冪,'d' 是 l 的冪。

我對常規和 CFG 很好,但由於不受限制的語法可以在生產的左側包含多個非終端,我很困惑並且無法找到解決方案。

我不會嘗試最有效或最優雅的語法,而是嘗試一種簡單的語法——我們可以很快看到的語法一定是正確的。

你的語言 L = {a^ib^jc^k^d^l: i not equal to k AND j not equal to l} 可以寫成四種語言 L1、L2、L3 和 L4 的並集:

  • L1 = {a^ib^jc^k^d^l: i < k AND j < l}
  • L2 = {a^ib^jc^k^d^l: i < k AND j > l}
  • L3 = {a^ib^jc^k^d^l: i > k AND j < l}
  • L4 = {a^ib^jc^k^d^l: i > k AND j > l}

每一種情況都有一些不受限制的文法,稱為文法 G1、G2、G3、G4。 然后,我們的文法 G 可以有一個起始非終結符,它產生這四個文法中每一個的起始非終結符,並且它將生成這些文法的語言的並集。 因此,如果我們能找到 G1 - G4,我們的問題就解決了。 很容易看出,這些文法中的每一個都非常相似,不同之處僅在於哪些符號的出現頻率低於其他符號。 我們將專注於嘗試找到 G1,並將 G2、G3 和 G4 留作練習。

我們對 G1 的策略如下:分別為 i < k 的 a^ic^k 和 j < l 的 b^jd^l 編寫語法; 然后,合並它們並對 b 和 c 重新排序,以便所有內容都按正確的順序排列。 所以,對於第一部分:

S1 := X1 Y1
X1 := A1 X1 C1 | X1 C1 | C1
Y1 := B1 Y1 D1 | Y1 D1 | D1
A1 := a
B1 := b
C1 := c
D1 := d

這給了我們像 a^ic^kb^jd^l 這樣的字符串,其中 i < k 和 j < l。 這非常接近我們想要的,但我們需要交換 c 和 b。 為此,我們可以使用一個特殊的新非終結符,它的唯一功能是允許 A1、B1、C1 和 D1 解析為 a、b、c 和 d,但前提是它們的順序正確。 為此,我們將添加一個產生式 C1 B1:= B1 C1,這將允許語法將 B 和 C 冒泡到正確的位置。 我們可以調用我們的特殊標記 M1:

// ensure i < k and j < l
S1 := X1 Y1 M1'
X1 := A1 X1 C1 | X1 C1 | C1
Y1 := B1 Y1 D1 | Y1 D1 | D1

// allow b's to come before c's
C1 B1 := B1 C1

// require d's come last, c's come before d's,
// b's come before c's and d's, and a's come
// before everything
D1 M1' := M1 d
D1 M1 d := M1 dd
C1 M1 d := M1 cd
C1 M1 c := M1 cc
B1 M1 d := M1 bd
B1 M1 c := M1 bc
B1 M1 b := M1 bb
A1 M1 d := M1 ad
A1 M1 c := M1 ac
A1 M1 b := M1 ab
A1 M1 a := M1 aa

// allow the derivation to terminate nondeterministically
// only by terminating after removing all nonterminals
// will the resulting derivation be in the grammar's language
M1 := (empty)

讓我們做幾個簡單的例子來說明 abccdd 在語言中,而 aabccdd 和 accbdd 不是:

S1 := X1 Y1 M1'
   := A1 X1 C1 Y1 M1'
   := A1 C1 C1 Y1 M1'
   := A1 C1 C1 B1 Y1 D1 M1'
   := A1 C1 C1 B1 D1 D1 M1'
   := A1 C1 B1 C1 D1 D1 M1'
   := A1 B1 C1 C1 D1 D1 M1'
   := A1 B1 C1 C1 D1 M1 d
   := A1 B1 C1 C1 M1 dd
   := A1 B1 C1 M1 cdd
   := A1 B1 M1 ccdd
   := A1 M1 bccdd
   := M1 abccdd
   := abccdd

S1 := X1 Y1 M1'
   := A1 X1 C1 Y1 M1'
   := A1 A1 X1 C1 C1 Y1 M1'
   ... unable to proceed, cannot get rid of X1 without adding more c's

S1 := X1 Y1 M1'
   := A1 X1 C1 Y1 M1'
   := A1 C1 C1 Y1 M1'
   := A1 C1 C1 B1 Y1 D1 M1'
   := A1 C1 C1 B1 D1 D1 M1'
   := A1 C1 C1 B1 D1 M1 d
   := A1 C1 C1 B1 M1 dd
   := A1 C1 C1 M1 bdd
   ... no production matches C1 M1 b, no way to clear C1 now

請注意,我在第一步中引入了特殊標記 M',不確定是否真的有必要,但您可以玩一下。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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