代码之家  ›  专栏  ›  技术社区  ›  MikeRand

扑克手范围分析器…如何编写语法?

  •  3
  • MikeRand  · 技术社区  · 14 年前

    我想构建一个扑克手范围解析器,通过它我可以提供如下字符串(假设一个标准的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
    

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

    谢谢,

    迈克

    1 回复  |  直到 9 年前
        1
  •  3
  •   chrischu    14 年前

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

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

    其中{}表示0次或多次出现,[]表示0次或1次出现,|表示|的左边或右边。

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

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

    这些例子是你自己创造的还是从外部给你的(读:你不能改变它们)?

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