2010-07-13 65 views
3

我想構建一個撲克手動解析器,從而我可以提供一個字符串,例如以下(假設標準的52張牌,排名2-A,s =適合,o = offsuit):撲克手範圍解析器...我如何編寫語法?

"22+,A2s+,AKo-ATo,7d6d" 

解析器應該能夠產生以下組合:

6 combinations for each of 22, 33, 44, 55, 66, 77, 88, 99, TT, JJ, KK, QQ, AA 
4 combinations for each of A2s, A3s, A4s, A5s, A6s, A7s, A8s, A9s, ATs, AJs, AQs, AKs 
12 combinations for each of ATo, AJo, AQo, AKo 
1 combination of 7(diamonds)6(diamonds) 

我想我知道了語法部分,但不是全部:

NM+ --> NM, N[M+1], ... ,N[N-1] 
NN+ --> NN, [N+1][N+1], ... ,TT where T is the top rank of the deck (e.g. Ace) 
NP - NM --> NM, N[M+1], ... ,NP 
MM - NN --> NN, [N+1][N+1], ..., MM 

我不知道該用於處理適合性的語法表達。

我是一個新手編程,所以請原諒這個基本的問題:這是一個語法歸納問題或解析問題?

感謝,

邁克

回答

3

那麼你或許應該看看EBNF展現你的語法在一個被廣泛接受的方式。

我認爲這將是這個樣子:

S = Combination { ',' Combination } . 
Combination = Hand ['+' | '-' Hand] . 
Hand = Card Card ["s" | "o"] . 
Card = rank [ color ] . 

凡{}表示0或多個正好,[]表示0或1發生和|意味着什麼剩下的|或什麼權利|。

所以基本上這是什麼歸結爲是一個開始符號(S),指出該解析器從1到處理到任意數量的組合,均有一個「」隔開。

這些組合包括一個卡的描述中,然後或者是「+」,一個「 - 」,而另一個卡描述或沒有。

A卡描述由秩和任選的顏色(黑桃,紅桃,等)。等級和顏色沒有大寫的事實表明它們不能被進一步分成子部分(使它們成爲終端類)。

我的例子沒有提供offsuite/suite的可能性,主要是因爲在你的例子中,有一次o/s在最後的「AK-ATo」和一次在中間的「A2s +」 。

難道這些例子你自己創作或者他們從外部來源給你(讀:你不能改變它們)?

如果你可以改變他們,我會強烈建議把那些(末尾爲例)組合的一個指定位置,使創建語法和最終解析輕鬆了許多。

+0

修正AK-ATo爲AKo-ATo ...好,趕快,謝謝。語法是否也需要做以下操作來識別每個「手」> 1「卡」: S =組合{','組合}。 組合=手['+'| ' - '手]。 Hand = Card {Card} ['s'|'o']。 Card =等級[顏色]。 – MikeRand 2010-07-14 01:23:04

+0

啊,我忘了手中的第二張牌。我在我的帖子中修正了語法,以便每手可以(確切地)2張牌。 我不推薦使用卡{卡},因爲這意味着1和許多卡之間,所以基本上可以有1,3或5000卡在這樣的手中,我認爲這不是你想要的。 – chrischu 2010-07-14 07:51:44

+0

那麼,一隻德州撲克手可能有2張牌,一隻手牌可能有3張牌,奧馬哈手可能有4張牌,而一隻手可能有5張牌。也許有一種比Card Card {Card}更明智的方式來展示這一點(即HoldEmHand,StudHand,OmahaHand是三種不同的非終端作品)。也許卡卡[卡] [卡] [卡] ['s'|'o']? – MikeRand 2010-07-14 10:21:31