解析扑克游戏描述(由多个不同的转换器生成)

时间:2012-11-26 16:52:06

标签: java parsing

对于一个爱好项目我试图写一些扑克应用程序。它的部分功能是能够通过游戏描述解析扑克论坛中的消息。以下是消息示例的纯文本版本:

示例1

    $0.02/$0.05 No-Limit Hold'em (8 handed) 

Known players:
 BB: $1.70   UTG2: $13.05   MP1: $2.89   MP2: $2.64   MP3 (Hero): $5.28   CO
: $5.00   BU: $5.00   SB: $11.37  

Preflop: Hero is MP3 with 8 
[http://resources.pokerstrategy.com/smileys/heart.png], 8 
[http://resources.pokerstrategy.com/smileys/club.png].
UTG2 folds, MP1 raises to $0.15, MP2 calls $0.15, Hero calls $0.15, CO folds, 
BU calls $0.15,  2 folds, BB folds.

Flop: ($0.67) 8 [http://resources.pokerstrategy.com/smileys/diamond.png], K 
[http://resources.pokerstrategy.com/smileys/club.png], 6 
[http://resources.pokerstrategy.com/smileys/diamond.png] (4 players)
MP1 checks, MP2 checks, Hero bets $0.47, BU folds, MP1 folds, MP2 calls $0.47.

Turn: ($1.61) A [http://resources.pokerstrategy.com/smileys/club.png] (2 
players)
MP2 checks, Hero checks.

River: ($1.61) Q [http://resources.pokerstrategy.com/smileys/club.png] (2 
players)
MP2 bets $0.60, Hero raises to $2.10, MP2 calls $1.42.

Final Pot: $5.73.  

示例2

Grabbed by Holdem Manager <http://www.holdemmanager.net>
 NL Holdem $0.05(BB) Replayer 
 SB ($5.02)
 BB ($4.78)
 UTG ($2)
 UTG+1 ($2)
 UTG+2 ($1.88)
 MP1 ($5.32)
CO ($10.36) (21/18 на 109 рук, С-бет Ф=88%(11), С-бет Т=33%(3), АФ=2,6 
(4,5/3,0/0,5), WTSD=41%, W$SD=71%)
 Hero ($10.98)

Dealt to Hero 9 [http://resources.pokerstrategy.com/smileys/spade.png] T 
[http://resources.pokerstrategy.com/smileys/spade.png] 

 UTG calls $0.05, fold, fold, fold, CO raises to $0.20, Hero calls $0.20, 
fold, fold, fold

 FLOP ($0.52) J [http://resources.pokerstrategy.com/smileys/club.png] 8 
[http://resources.pokerstrategy.com/smileys/spade.png] 4 
[http://resources.pokerstrategy.com/smileys/diamond.png] 

CO bets $0.35, Hero calls $0.35

 TURN ($1.22) J [http://resources.pokerstrategy.com/smileys/club.png] 8 
[http://resources.pokerstrategy.com/smileys/spade.png] 4 
[http://resources.pokerstrategy.com/smileys/diamond.png] 9 
[http://resources.pokerstrategy.com/smileys/heart.png] 

CO checks, Hero checks

 RIVER ($1.22) J [http://resources.pokerstrategy.com/smileys/club.png] 8 
[http://resources.pokerstrategy.com/smileys/spade.png] 4 
[http://resources.pokerstrategy.com/smileys/diamond.png] 9 
[http://resources.pokerstrategy.com/smileys/heart.png] 4 
[http://resources.pokerstrategy.com/smileys/spade.png] 

CO bets $1, Hero ??? 

基本上这两个例子是由两个不同的转换器生成的。目前大约有20种不同的转换器。

我需要做的是能够解析不同转换器的这些游戏描述,并将游戏的文本描述“翻译”为java对象游戏。我已经编写了一些带有大量正则表达式的代码。此代码可以正确解析大约70%的测试,但是:

  • 维护真的很难
  • 我想教自己一些新的和酷的东西。

那么,除了regexp之外,我的其他选择是什么?我目前正在研究ANTLR,但我不确定它是否是此任务的最佳选择。

1 个答案:

答案 0 :(得分:1)

ANTLR绝对适合您的要求。使用正则表达式进行语言处理非常容易,从一个版本到另一个版本的任何更改都比使用ANTLR或类似工具更容易破坏您的解释器。您可以做的是编写单个Lexer和一个基础解析器,然后可以通过更具体的解析器扩展,以了解转换器之间的特定差异。

一旦你创建了一个Lexer,并且知道你在使用解析器做了什么,那么在ANTLR中改变东西比在自己动手的解决方案中更快 A LOT !我同意ANTLR文档并不是最好的,但是有很多很好的教程可供第三方使用ANTLR 3(对于任何特定的问题,你都会在SO上获得很好的帮助)。

我个人的偏好是制作输出AST树的相当简单的Lexer / Parsers,然后手动编码一个树状步行器,它在Parser提供的节点上行走。有些人会争论在ANTLR中制作树木行走者,但我发现这比它的价值更难和耗时(因为它在很大程度上不可重复使用)。

可能需要一段时间才能适应创建一个好的语法文件的思维模式,但是一旦你完成它就会非常令人满意,并且你看到它是你第一次需要修改或扩展时有多好一些东西。 ;)