2012-11-26 18 views
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 ??? 

基本上由兩個不同的轉換器產生的這兩個例子。目前大約有20種不同的轉換器。

我需要做的是能夠解析不同轉換器的這些遊戲描述,並將遊戲的文本描述「翻譯」爲java對象遊戲。我已經寫了很多正則表達式的代碼。此代碼可以正確地分析我的測試大約70%,但:

  • 這真的很難保持
  • 我想教我一些新的東西和冷靜。

那麼,什麼是我的正則表達式之外的其他選項?我目前正在研究ANTLR,但我不確定這是否是這項任務的最佳選擇。

+3

ANTLR肯定會是一個很好的適合你的需求。但是,您可能必須爲每個不同的轉換器編寫一個語法文件。 – Thor84no

+0

這正是我所害怕的。使用正則表達式,我可以編寫一些非常複雜的GeneralParser.java,但它適用於所有轉換器。我仍在研究ANTLR,但看不出如何爲那裏的所有轉換器創建一個語法。這是不好的,它更乾淨,無錯誤的解決方案,然後正則表達式,但爲清晰起見,它需要太多的努力。 – GrayR

+0

感謝您的詳細評論。我必須同意你的觀點,即上下文無關語法方法比正則表達式更好。但我希望這裏有第三種方式。不過,如果我選擇這種方法並開始編寫語法,ANTLR是最好的工具嗎?我主要關心文檔。 ANTLR文檔第一眼看起來並不完整和完整,或者我正在爲他們尋找錯誤的地方。 – GrayR

回答

1

ANTLR肯定會是一個很好的適合你的需求。使用正則表達式進行語言處理非常脆弱,從一個版本到另一個版本的任何更改都會比使用ANTLR或類似工具更容易中斷解釋器。你可以做的是編寫一個Lexer和一個基礎解析器,然後可以通過更具體的解析器來擴展轉換器之間的特定差異。

一旦你做了一個詞法分析器,並且知道你在用解析器做什麼,它可以更快地改變ANTLR中的東西,而不是在自己的解決方案中!我不同意,ANTLR文檔是不是最好的,但也有一噸很好的教程在那裏從第三方ANTLR 3(你會在這裏得到很好的幫助的SO任何特定問題)。

我個人的偏好是使相當簡單的詞法分析器/解析器是輸出AST樹,然後手動譯碼樹行者,它遍歷節點,因爲它們可以由分析器提供。有些人會爭論在ANTLR中樹步行者,但是我發現這比它值得的更困難和耗時(因爲它基本上不可重複使用)。

習慣創建一個好語法文件的想法可能需要一點時間,但是一旦你完成了它,它會非常令人滿意,而且你會發現第一次需要修改或延伸一些。 ;)