簡體   English   中英

使用無上下文語言測試成員資格

[英]Testing membership in context-free language

我正在從事老虎機迷你游戲應用程序。 構成獲獎獎項的規則相當復雜(n種,任何種類的n,特定序列),並且使事情變得更加復雜,此代碼應適用於(n> = 3)的老虎機卷軸。

因此,經過一番思考,我認為定義無上下文語言是最有效和可擴展的方法。 這樣,我可以在XML文件中定義語法。

所以我的問題是,給定一串符號S,如何測試S是否在給定的上下文無關語言中? 我會簡單地用盡規則,直到沒有有效的規則/符號,或者是否有已知的算法可以幫助您。 謝謝。

另外,這種語言似乎是非常規的,對嗎? 我從來都不擅長證明,所以我避免嘗試。

對我的方法的任何評論也將不勝感激。

謝謝。

上下文無關語法的一般情況很難評估。

但是,有一些方法可以解析上下文無關語法的子集中的語法。

例如:編譯器經常使用SLRLL語法分析器來解析編程語言,而編程語言也是上下文無關的語言。 要使用這些語法,您的語法必須位於這些“家族”之一中(請記住-每種上下文無關語言都有無限數量的語法)。

您可能要使用的一些實際用於編譯器的實用工具是Java中的JavaCC和C ++中的bison
(如果我沒記錯的話,Bison是SLR解析器,JavaCC是LL解析器,但我可能是錯的)

聚苯乙烯
對於具有n個插槽和k符號的特定老虎機-該語言明確地是規則的,因為其中最多有k n個 “單詞”,並且每種有限的語言都是規則的。 如果您正在尋找所有老虎機的語法器,那么事情顯然會被編譯。

“ ...給定一串符號S,如何測試S是否在給定的上下文無關語言中?”

如果字符串w在L(G)中; 查找派生w的G的生產規則序列的過程稱為調用解析。 因此,您必須創建一個分析樹以搜索某些派生。 為此,您需要進行詳盡的廣度優先搜索。 出現了一個嚴重的問題:搜索過程可能永遠不會終止。 為了防止無休止的搜索,您必須將語法轉換為正常形式

“而且,這種語言似乎是非常規的,對嗎?”

不必要。 每種常規語言都是無上下文的(因為它可以由CTG進行描述),但是並非每種無上下文語言都是常規的。

最好的選擇是使用適當的編程語言進行實際編碼。 CFG是多余的,因為很難編寫一些“相當復雜”的規則,就像您所說的那樣。 例如,語法不適合談論事物的數量。

例如,如何用這種語言編寫“櫻桃的數量>其他任何物體的數量”的代碼? 您要給該計划的人怎么做? CFG不能輕易地表達這樣的概念,而正則表達式也不能輕易地做到這一點。

答案是語法不適合該任務,除非老虎機試圖制作英語句子。

您還必須考慮兩個或多個“獎賞序列”匹配時會發生什么! 假設您要頒發最高獎,您需要一個有序的識別器列表。 這並不是說除了任意函數​​之外,您不能使用(例如)正則表達式對識別器進行編碼。 我只是說一般的CFG解析是過大的,因為CFG通過正則語言(即正則表達式)使您能夠解析任意深度的樹(例如N級或更高級別的嵌套括號),這可能不是你在乎什么

這並不是說您不想例如允許使用正則表達式。 您可以通過使用解析器生成器識別涉及櫻桃香蕉和梨的正則表達式來簡化該工作,請參閱http://en.wikipedia.org/wiki/Comparison_of_parser_generators ,然后可以將其嵌入 ,盡管您可能想簡單地滾動自己的正則表達式遞歸下降解析器(再次假設您不關心CFG,特別是如果您的令牌是有限長度的話)。

例如,這是我可能以偽代碼實現的方式(理想情況下,您將使用具有良好列表操作的靜態類型檢查語言,這是我想不起的事情):

rules = []
function Rule(name, code) {
    this.name = name
    this.code = code

    rules.push(this)  # adds them in order
}

##########################

Rule("All the same", regex(.*))

Rule("No two-in-a-row", function(list, counts) {
    not regex(.{2}).match(list)
})

Rule("More cherries than anything else", function(list, counts) {
    counts[cherries]>counts[x] for all x in counts
      or
    sorted(counts.items())[0]==cherries
      or
    counts.greatest()==cherries
})

for token in [cherry, banana, ...]:
    Rule("At least 50% "+token, function(list, counts){
        counts[token] >= list.length/2
    })

暫無
暫無

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

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