【问题标题】:Poker hand range parser ... how do I write the grammar?扑克手范围解析器...我如何编写语法?
【发布时间】:2010-07-13 21:41:09
【问题描述】:

我想构建一个扑克手牌范围解析器,借此我可以提供如下字符串(假设标准的 52 张牌,等级 2-A,s = 同花,o = 非同花):

"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

我不知道处理适合性的语法表达式。

我是一个编程新手,所以请原谅这个基本问题:这是语法归纳问题还是解析问题?

谢谢,

迈克

【问题讨论】:

    标签: parsing grammar


    【解决方案1】:

    嗯,你应该看看 EBNF 以以一种被广泛接受的方式展示你的语法。

    我认为它看起来像这样:

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

    其中 {} 表示出现 0 次或多次,[] 表示出现 0 或 1 次,|表示 | 剩下的任何一个或 | 的权利。

    所以基本上这归结为一个开始符号 (S),它表示解析器必须处理从 1 到任意数量的全部由“,”分隔的组合。

    这些组合包括一张卡片的描述,然后是“+”、“-”和另一张卡片描述,或者什么都没有。

    卡牌描述由等级和可选的颜色(黑桃、红心等)组成。 rank 和 color 没有大写的事实表明它们不能进一步划分为子部分(使它们成为终端类)。

    我的示例没有提供非套件/套件的可能性,这主要是因为在您的示例中,有一次 o/s 出现在“AK-ATo”的最后,而有一次出现在中间的“A2s+”。

    这些示例是您自己创建的还是从外部来源提供给您的(阅读:您无法更改它们)?

    如果您可以更改它们,我强烈建议将它们放在组合的一个指定位置(例如在末尾),以使创建语法和最终的解析更加容易。

    【讨论】:

    • 将 AK-ATo 修复为 AKo-ATo...很好,谢谢。语法是否还需要执行以下操作来识别每个“手”> 1 个“卡片”:S = 组合 {',' 组合}。组合 = 手['+' | '-' 手]。 Hand = Card{Card}['s'|'o']。卡片 = 等级 [ 颜色 ]。
    • 啊,是的,我忘记了手中的第二张牌。我在我的帖子中修正了语法,以允许(准确地)每手 2 张牌。我不推荐使用 Card{Card},因为这意味着 1 到很多张牌,所以基本上这样的一手牌可能有 1、3 或 5000 张牌,我认为这并不是你真正想要的。
    • 嗯,德州扑克牌可能有 2 张牌,梭哈牌可能有 3 张牌,奥马哈牌可能有 4 张牌,平局牌可能有 5 张牌。也许有一种比 Card Card {Card} 更聪明的方式来展示这一点(即让 HoldEmHand、StudHand、OmahaHand 是三个不同的非终端部分)。也许卡卡[卡] [卡] [卡] ['s'|'o']?
    • 是的,我认为从现在开始的一切都只是你必须自己决定的建模。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-04
    相关资源
    最近更新 更多