raa0121 / GoBCDice

GoBCDice is BCDice reimplemented by Go.
BSD 3-Clause "New" or "Revised" License
9 stars 2 forks source link

加算ロールと計算の実装 #10

Closed ochaochaocha3 closed 5 years ago

ochaochaocha3 commented 5 years ago

プロジェクト「加算ロールと計算の実装」が完了しました。特徴は以下のとおりです。

体系的なBCDiceコマンドの処理

プログラミング言語の処理系と同様に、入力されたBCDiceコマンドを抽象構文木に変換して処理します。プログラムの規模は大きいですが、演算子の順番なども考慮した計算を完璧に行うことができ、今後の実装も機能ごとに分けながら行うことができます。

add_roll_1

処理手順

  1. 字句解析(pkg/core/{lexer,token})
  2. 構文解析(pkg/core/{parser,ast})
    • goyaccで生成したLALR(1)構文解析器を使用します。
    • 構文解析によって抽象構文木を生成します。
  3. コマンドごとの評価処理、メッセージ生成(pkg/core/{command,evaluator,notation})
    • 計算コマンド、加算ロール式など、コマンドごとに評価手順やメッセージ生成処理を分けて実装しています。
    • 途中経過の式は、抽象構文木から読みやすい中置表記として生成します。

テスト

各段階でテストを行い、多くの入力に対して各段階が期待通りの結果を返すことを確認しています。

ゲームシステムごとのパッケージ分け、読み込み

ゲームシステムごとにパッケージを作り、pkg/dicebot/gamesystem 以下にそれらのパッケージを配置する予定です。現在のBCDiceと同様にpkg/dicebot/listでゲーム識別子に対応するコンストラクタを登録することで、BCDice本体(pkg/bcdice)からゲーム識別子を指定してダイスボットを作ることができます。

既存のテストデータをそのまま読み込み可能

pkg/dicebot/gamesystem/basic/testdata/DiceBot.txtのような、現在のBCDiceのテストデータをそのまま読み込むことができるため、各ゲームシステムのダイスボットが正しく移植されているかを簡単に確認することができます。テストデータを現在のBCDiceからコピーすれば、ダイスボットごとに最小限のテストコードを書くだけ(例:pkg/dicebot/gamesystem/basic/basic_test.go)で多くのテストを実行できます。

高機能なREPL

RubyのirbのようなREPLであるGoBCDiceREPL(cmd/GoBCDiceREPL)を作りました。readlineにも対応しており、ダイスボットの動作確認が行いやすくなっています。

GoBCDiceREPL
ochaochaocha3 commented 5 years ago

mattnさんのgo-colorableを導入すると、WindowsでもREPLが正常に表示されるようになりました。

GoBCDiceREPL_start GoBCDiceREPL_help