1

趣味のプロジェクトのために、私はポーカーアプリケーションを書こうとしています。その機能の一部は、ゲームの説明を含むポーカーフォーラムからのメッセージを解析する機能です。メッセージの例のプレーンテキストバージョンは次のとおりです。

例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 ??? 

基本的に、これら2つの例は、2つの異なるコンバーターによって生成されました。そして現在、そこには約20の異なるコンバーターがあります。

私がする必要があるのは、さまざまなコンバーターのこれらのゲームの説明を解析し、ゲームのテキストの説明をJavaオブジェクトGa​​meに「変換」できるようにすることです。私はすでにたくさんの正規表現を使っていくつかのコードを書いています。このコードは私のテストの約70%を正しく解析できますが、次のようになります。

  • 維持するのは本当に難しい
  • 何か新しくてかっこいいことを自分に教えたいです。

それで、正規表現以外の私の他のオプションは何ですか?私は現在ANTLRを調べていますが、それがこのタスクに最適かどうかはわかりません。

4

1 に答える 1

1

ANTLRは間違いなくあなたの要件にぴったりです。言語処理に正規表現を使用することは非常に脆弱であり、あるバージョンから別のバージョンへの変更は、ANTLRまたは同様のツールを使用する場合よりも、インタープリターを壊す可能性が非常に高くなります。あなたができるかもしれないことは、単一のレクサーとベースパーサーを書くことです。それは、コンバーター間の特定の違いのために、より具体的なパーサーによって拡張することができます。

レクサーを作成し、パーサーで何をしているのかを理解したら、独自のソリューションよりもANTLRで物事を変更する方がはるかに迅速ですANTLRドキュメントが最適ではないことには同意しますが、サードパーティからのANTLR 3に関する優れたチュートリアルがたくさんあります(特定の問題については、ここでSOに関する優れたヘルプが得られます)。

私の個人的な好みは、ASTツリーを出力するかなり単純なレクサー/パーサーを作成し、パーサーによって提供されるノードをウォークするツリーウォーカーを手動でコーディングすることです。ANTLRでツリーウォーカーを作ることについても議論する人もいますが、これは価値があるよりも難しく、時間がかかることがわかりました(とにかくほとんど再利用できなかったため)。

優れた文法ファイルを作成するという考え方に慣れるまでには少し時間がかかる場合がありますが、一度作成して、初めて何かを変更または拡張する必要がある場合にどれだけ優れているかを確認すると、非常に満足のいくものになります。;)

于 2012-11-27T00:23:12.947 に答える