[英]How can I find regular grammar for L* if we are given a grammar for language L?
有什么通用的方法嗎? 例如,我們有一種通用的方法,通過添加生產S-> S1 | | | | | | | | | | | | | | | |,來查找L1 U L2的語法。 S2,其中S1和S2分別是L1和L2語法的起始符號。 提前致謝..
通常,給定語法G
使得L(G) = L'
,沒有算法總是產生規則語法G'
使得L(G') = (L')*
。 對於初學者, (L')*
可能不是常規語言。 即使您允許該過程識別這種情況並在這種情況下打印“非常規語言”,這通常也是不可能的,因為這將使我們能夠確定任意不受限制的語法是否會生成特定的字符串(這種構造不是很困難,但是除非需要,否則我不會提供。 這是一個無法確定的問題,因此我們無法識別無限制語法中的常規語言。
也許您的問題是,如果最初使用常規語法,是否有一個整潔的結構可以做到這一點。 在這種情況下,答案是明確明確的“是!” 這是一個很容易描述的過程(盡管在實踐中可能效率低下),僅用於此操作:
因此,我們可以機械地從L
的常規語法變為L*
常規語法。
如果只希望L*
任何語法,最簡單的方法可能是引入一個新的開始狀態S'
和產生式S' := S'S' | S
S' := S'S' | S
,其中S
是輸入語法的開始符號。 這顯然不能給出規則的語法,但是-如果輸入語法生成了規則的語言,則該語法也可以。
示例:給出常規語法
S := 0S | 1T
T := 0S | 1T | 1
構造為我們提供了這種不確定的有限自動機:
q s q'
- - -
S 0 S
S 1 T
T 0 S
T 1 T
T 1 (H)
構造為我們提供了正則表達式:
(0*1)(0*1)*1
Kleene的閉包為:
((0*1)(0*1)*1)*
我們從標准構造中認識到此自動機是等效的:
q s q'
- - -
(I) - S
S 0 S
S 1 T
T 0 S
T 1 T
T 1 H
H - (I)
遵循以下常規語法:
I := S | -
S := 0S | 1T
T := 0S | 1T | H
H := I
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.