2013-09-23 49 views
2

我是python的新手,試圖在語法中生成所有可能的語句。 下面是語法:試圖生成一個簡單的形式語法的所有語句

#set of non terminals 
    N = ('<subject>', '<predicate>', '<noun phrase>', '<noun>', '<article>', '<verb>', '<direct object>') 
    #set of teminals 

    T = ('the', 'boy', 'dog', 'bit') 
    #productions 
    P = [ ('Sigma',   ['<subject>', '<predicate>']), \ 
    ('<subject>',  ['<noun phrase>']),   \ 
    ('<predicate>',  ['<verb>']),     \ 
    ('<predicate>',  ['<verb>','<direct object>']), \ 
    ('<noun phrase>', ['<article>','<noun>']),  \ 
    ('<direct object>', ['<noun phrase>']),   \ 
    ('<noun>',   ['boy']),      \ 
    ('<noun>',   ['dog']),      \ 
    ('<article>',  ['the']),      \ 
    ('<verb>',   ['bit'])      ] 

這裏是我的嘗試,我使用的是隊列類有條不紊地實現它,

# language defined by the previous grammar. 
Q = Queue() 
Q.enqueue(['Sigma']) 
found = 0 
while 0 < len(Q): 
    print "One while loop done" 
    # Get the next sentential form 
    sf = Q.dequeue() 
    sf1 = [y for y in sf] 
    for production in P: 
     for i in range(len(sf1)): 
       if production[0] == sf1[i]: 
         sf[i:i+1] = [x for x in production[1]] 
         Q.enqueue(sf) 
         Q.printQ() 

我得到的無限循環的,也是我現在面臨的一些問題如果我更改了sf的一個副本,那麼隊列中的所有內容都會發生變化。任何幫助表示讚賞,任何指示,提示將是巨大的

這裏是預期輸出:

 The dog bit the boy 
     The boy bit the dog 
     The boy bit the boy 
     The dog bit the dog 
     The dog bit 
     The boy bit 
+1

您的縮進被打破。從源文件中複製它,然後選擇代碼並按下Ctrl-K進行格式化。如果你沒有得到正確的縮進,我們不能說出Python如何認爲你的代碼是結構化的。 – user2357112

+0

我修復了縮進。這就是我所做的一切,因爲我陷入了無限循環。謝謝參觀。欣賞它 – user1772218

+0

您要求我們爲您編寫算法。 –

回答

2

我面臨着一些問題與淺深層副本,如果我改變SF的一個副本,隊列中的一切都發生了變化

是的。在Python中,列表是具有自己標識的對象。所以:

Q.enqueue(['Sigma']) 

創建一個(單元素)列表併入列對它的引用。

sf = Q.dequeue() 

從Q引用並將其分配給變量'sf'的彈出。

sf[i:i+1] = ... 

對該列表(「sf」所指的那個)進行了更改。

Q.enqueue(sf) 

排隊對同一列表的引用。

所以只涉及一個列表對象,Q只包含多個對它的引用。

相反,您可能希望Q中的每個條目都是對單獨列表(句子形式)的引用,因此您必須爲每次調用Q.enqueue創建一個新列表。

根據您的解決方法,代碼中可能存在或可能不存在其他問題。考慮:

(1)每個句子有多個派生詞,你只需要'找到'一個(例如最左邊的派生詞)。 (2)一般來說,雖然不在你的例子語法中,但是一個產品的RHS可能有一個以上的非終端事件(例如,如果COND,那麼STMT else STMT),並且這些事件不需要派生出相同的子-形式。

(3)通常,語法可以生成無限的一組句子。


順便說一句,複製Python中的列表,而不是說

copy = [x for x in original] 

它更簡單地說:

copy = original[:] 
+0

謝謝你的迴應,它的工作。一旦我解決了複印問題,通過打印報表,我可以看到我的實施出了什麼問題。我一起掃描所有非終端。通過掃描一個非終端,然後在所有作品中找到它的匹配都有訣竅,是的,這只是一個示例語法來理解事情是如何工作的,它只是被我們誣陷,以瞭解我們是否可以用python編寫它。再一次非常感謝你。 – user1772218

0

我創建了一個簡單的語法,允許指定不同在替代方案和選擇方面的句子。用該語法描述的句子可以被解析。屬性語法使用Coco/R進行描述,其中有一個Python版本(http://www.ssw.uni-linz.ac.at/Coco/#Others)。我對C#更熟悉,所以我在這裏創建了一個C#項目,可以作爲您的示例:https://github.com/abeham/Sentence-Generator

例如,解析「(這|那)是[很好]一句」與簡單的語法解析器創建四句話: *這是一個句子 *這是一個漂亮的句子 *這是一個句子 *這是一個很好的句子

只有有限的句子可以創建與該語法,因爲沒有重複的符號。

我知道已經存在一個可以接受的答案,但我希望這個答案對於像我這樣的人來說也是有價值的,他們來到這裏尋找一個通用的解決方案。至少我沒有在網上找到類似的東西,這就是我創建github項目的原因。