对于一个爱好项目我试图写一些扑克应用程序。它的部分功能是能够通过游戏描述解析扑克论坛中的消息。以下是消息示例的纯文本版本:
示例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,但我不确定它是否是此任务的最佳选择。
答案 0 :(得分:1)
ANTLR绝对适合您的要求。使用正则表达式进行语言处理非常容易,从一个版本到另一个版本的任何更改都比使用ANTLR或类似工具更容易破坏您的解释器。您可以做的是编写单个Lexer和一个基础解析器,然后可以通过更具体的解析器扩展,以了解转换器之间的特定差异。
一旦你创建了一个Lexer,并且知道你在使用解析器做了什么,那么在ANTLR中改变东西比在自己动手的解决方案中更快 A LOT !我同意ANTLR文档并不是最好的,但是有很多很好的教程可供第三方使用ANTLR 3(对于任何特定的问题,你都会在SO上获得很好的帮助)。
我个人的偏好是制作输出AST树的相当简单的Lexer / Parsers,然后手动编码一个树状步行器,它在Parser提供的节点上行走。有些人会争论在ANTLR中制作树木行走者,但我发现这比它的价值更难和耗时(因为它在很大程度上不可重复使用)。
可能需要一段时间才能适应创建一个好的语法文件的思维模式,但是一旦你完成它就会非常令人满意,并且你看到它是你第一次需要修改或扩展时有多好一些东西。 ;)