bcdice 3.0.0.pre.alpha.1 → 3.0.0.pre.alpha.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (255) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/test.yml +1 -1
  3. data/.rubocop.yml +12 -0
  4. data/.rubocop_todo.yml +1 -0
  5. data/CHANGELOG.md +34 -0
  6. data/Gemfile +6 -3
  7. data/Rakefile +52 -18
  8. data/bcdice.gemspec +2 -0
  9. data/i18n/Amadeus/ja_jp.yml +386 -0
  10. data/i18n/Amadeus/ko_kr.yml +148 -0
  11. data/i18n/Cthulhu/ja_jp.yml +11 -0
  12. data/i18n/Cthulhu/ko_kr.yml +11 -0
  13. data/i18n/Cthulhu/zh_hant.yml +11 -0
  14. data/i18n/DetatokoSaga/ja_jp.yml +74 -0
  15. data/i18n/DetatokoSaga/ko_kr.yml +74 -0
  16. data/i18n/DoubleCross/ja_jp.yml +53 -0
  17. data/i18n/DoubleCross/ko_kr.yml +53 -0
  18. data/i18n/Dracurouge/ja_jp.yml +1374 -0
  19. data/i18n/Dracurouge/ko_kr.yml +295 -0
  20. data/i18n/Fiasco/ja_jp.yml +10 -0
  21. data/i18n/Fiasco/ko_kr.yml +10 -0
  22. data/i18n/FutariSousa/ja_jp.yml +720 -0
  23. data/i18n/FutariSousa/ko_kr.yml +746 -0
  24. data/i18n/Insane/ja_jp.yml +454 -0
  25. data/i18n/Insane/ko_kr.yml +502 -0
  26. data/i18n/Kamigakari/ja_jp.yml +276 -0
  27. data/i18n/Kamigakari/ko_kr.yml +204 -0
  28. data/i18n/KillDeathBusiness/ja_jp.yml +1092 -0
  29. data/i18n/KillDeathBusiness/ko_kr.yml +1062 -0
  30. data/i18n/LogHorizon/ja_jp.yml +3082 -0
  31. data/i18n/LogHorizon/ko_kr.yml +923 -0
  32. data/i18n/MagicaLogia/ja_jp.yml +564 -0
  33. data/i18n/MonotoneMuseum/ja_jp.yml +525 -0
  34. data/i18n/MonotoneMuseum/ko_kr.yml +89 -0
  35. data/i18n/Nechronica/ja_jp.yml +57 -0
  36. data/i18n/Nechronica/ko_kr.yml +14 -0
  37. data/i18n/StratoShout/ja_jp.yml +160 -0
  38. data/i18n/StratoShout/ko_kr.yml +160 -0
  39. data/i18n/ja_jp.yml +5 -0
  40. data/i18n/ko_kr.yml +7 -0
  41. data/i18n/zh_hant.yml +3 -0
  42. data/lib/bcdice/arithmetic/node.rb +154 -0
  43. data/lib/bcdice/base.rb +87 -101
  44. data/lib/bcdice/common_command.rb +2 -0
  45. data/lib/bcdice/common_command/add_dice.rb +5 -41
  46. data/lib/bcdice/common_command/add_dice/node.rb +92 -16
  47. data/lib/bcdice/common_command/add_dice/parser.rb +374 -274
  48. data/lib/bcdice/common_command/add_dice/parser.y +153 -0
  49. data/lib/bcdice/common_command/add_dice/randomizer.rb +25 -33
  50. data/lib/bcdice/common_command/barabara_dice.rb +6 -47
  51. data/lib/bcdice/common_command/barabara_dice/node.rb +84 -0
  52. data/lib/bcdice/common_command/barabara_dice/parser.rb +336 -0
  53. data/lib/bcdice/common_command/barabara_dice/parser.y +107 -0
  54. data/lib/bcdice/common_command/calc.rb +7 -30
  55. data/lib/bcdice/common_command/calc/node.rb +30 -0
  56. data/lib/bcdice/common_command/calc/parser.rb +271 -0
  57. data/lib/bcdice/common_command/calc/parser.y +79 -0
  58. data/lib/bcdice/common_command/choice.rb +137 -19
  59. data/lib/bcdice/common_command/d66_dice.rb +48 -34
  60. data/lib/bcdice/common_command/lexer.rb +46 -0
  61. data/lib/bcdice/common_command/repeat.rb +102 -0
  62. data/lib/bcdice/common_command/reroll_dice.rb +8 -158
  63. data/lib/bcdice/common_command/reroll_dice/node.rb +198 -0
  64. data/lib/bcdice/common_command/reroll_dice/parser.rb +421 -0
  65. data/lib/bcdice/common_command/reroll_dice/parser.y +158 -0
  66. data/lib/bcdice/common_command/upper_dice.rb +10 -129
  67. data/lib/bcdice/common_command/upper_dice/node.rb +181 -0
  68. data/lib/bcdice/common_command/upper_dice/parser.rb +412 -0
  69. data/lib/bcdice/common_command/upper_dice/parser.y +143 -0
  70. data/lib/bcdice/common_command/version.rb +9 -17
  71. data/lib/bcdice/deprecated/checker.rb +78 -0
  72. data/lib/bcdice/dice_table/d66_grid_table.rb +8 -0
  73. data/lib/bcdice/dice_table/d66_table.rb +10 -0
  74. data/lib/bcdice/dice_table/sai_fic_skill_table.rb +75 -17
  75. data/lib/bcdice/dice_table/sai_fic_skill_table/category.rb +25 -0
  76. data/lib/bcdice/dice_table/sai_fic_skill_table/skill.rb +23 -0
  77. data/lib/bcdice/dice_table/table.rb +8 -0
  78. data/lib/bcdice/game_system.rb +7 -1
  79. data/lib/bcdice/game_system/AFF2e.rb +1 -1
  80. data/lib/bcdice/game_system/AceKillerGene.rb +2 -2
  81. data/lib/bcdice/game_system/Airgetlamh.rb +3 -3
  82. data/lib/bcdice/game_system/Alsetto.rb +1 -1
  83. data/lib/bcdice/game_system/Alshard.rb +1 -1
  84. data/lib/bcdice/game_system/AlterRaise.rb +2 -2
  85. data/lib/bcdice/game_system/Amadeus.rb +46 -507
  86. data/lib/bcdice/game_system/Amadeus_Korean.rb +12 -456
  87. data/lib/bcdice/game_system/AnimaAnimus.rb +1 -1
  88. data/lib/bcdice/game_system/Arianrhod.rb +0 -1
  89. data/lib/bcdice/game_system/ArsMagica.rb +1 -1
  90. data/lib/bcdice/game_system/Avandner.rb +1 -1
  91. data/lib/bcdice/game_system/BBN.rb +1 -1
  92. data/lib/bcdice/game_system/BadLife.rb +1 -1
  93. data/lib/bcdice/game_system/BarnaKronika.rb +1 -1
  94. data/lib/bcdice/game_system/BeastBindTrinity.rb +1 -2
  95. data/lib/bcdice/game_system/BeginningIdol.rb +2 -3
  96. data/lib/bcdice/game_system/BeginningIdol_Korean.rb +2 -3
  97. data/lib/bcdice/game_system/BladeOfArcana.rb +2 -2
  98. data/lib/bcdice/game_system/BlindMythos.rb +1 -1
  99. data/lib/bcdice/game_system/BloodCrusade.rb +0 -1
  100. data/lib/bcdice/game_system/BloodMoon.rb +0 -1
  101. data/lib/bcdice/game_system/CardRanker.rb +1 -2
  102. data/lib/bcdice/game_system/ChaosFlare.rb +1 -1
  103. data/lib/bcdice/game_system/Chill.rb +1 -1
  104. data/lib/bcdice/game_system/CodeLayerd.rb +1 -1
  105. data/lib/bcdice/game_system/ColossalHunter.rb +1 -2
  106. data/lib/bcdice/game_system/Comes.rb +50 -0
  107. data/lib/bcdice/game_system/CrashWorld.rb +1 -1
  108. data/lib/bcdice/game_system/Cthulhu.rb +94 -97
  109. data/lib/bcdice/game_system/Cthulhu7th.rb +108 -67
  110. data/lib/bcdice/game_system/Cthulhu7th_ChineseTraditional.rb +1 -1
  111. data/lib/bcdice/game_system/Cthulhu7th_Korean.rb +1 -1
  112. data/lib/bcdice/game_system/CthulhuTech.rb +8 -14
  113. data/lib/bcdice/game_system/Cthulhu_ChineseTraditional.rb +7 -190
  114. data/lib/bcdice/game_system/Cthulhu_Korean.rb +5 -186
  115. data/lib/bcdice/game_system/DarkBlaze.rb +9 -5
  116. data/lib/bcdice/game_system/DarkDaysDrive.rb +17 -15
  117. data/lib/bcdice/game_system/DarkSouls.rb +1 -1
  118. data/lib/bcdice/game_system/DeadlineHeroes.rb +2 -2
  119. data/lib/bcdice/game_system/DemonParasite.rb +1 -2
  120. data/lib/bcdice/game_system/DetatokoSaga.rb +48 -149
  121. data/lib/bcdice/game_system/DetatokoSaga_Korean.rb +6 -274
  122. data/lib/bcdice/game_system/DiceOfTheDead.rb +9 -6
  123. data/lib/bcdice/game_system/DoubleCross.rb +102 -81
  124. data/lib/bcdice/game_system/DoubleCross_Korean.rb +13 -330
  125. data/lib/bcdice/game_system/Dracurouge.rb +376 -1678
  126. data/lib/bcdice/game_system/Dracurouge_Korean.rb +16 -271
  127. data/lib/bcdice/game_system/EarthDawn.rb +1 -1
  128. data/lib/bcdice/game_system/EarthDawn3.rb +1 -1
  129. data/lib/bcdice/game_system/EarthDawn4.rb +1 -1
  130. data/lib/bcdice/game_system/Elysion.rb +3 -4
  131. data/lib/bcdice/game_system/EmbryoMachine.rb +1 -1
  132. data/lib/bcdice/game_system/Emoklore.rb +131 -0
  133. data/lib/bcdice/game_system/EndBreaker.rb +1 -2
  134. data/lib/bcdice/game_system/EtrianOdysseySRS.rb +1 -1
  135. data/lib/bcdice/game_system/Fiasco.rb +87 -70
  136. data/lib/bcdice/game_system/Fiasco_Korean.rb +7 -95
  137. data/lib/bcdice/game_system/FilledWith.rb +462 -566
  138. data/lib/bcdice/game_system/FullMetalPanic.rb +1 -1
  139. data/lib/bcdice/game_system/FutariSousa.rb +103 -938
  140. data/lib/bcdice/game_system/FutariSousa_Korean.rb +7 -948
  141. data/lib/bcdice/game_system/{Gurps.rb → GURPS.rb} +184 -217
  142. data/lib/bcdice/game_system/Garako.rb +131 -39
  143. data/lib/bcdice/game_system/GardenOrder.rb +2 -2
  144. data/lib/bcdice/game_system/GehennaAn.rb +1 -1
  145. data/lib/bcdice/game_system/GeishaGirlwithKatana.rb +1 -1
  146. data/lib/bcdice/game_system/GoblinSlayer.rb +1 -1
  147. data/lib/bcdice/game_system/GoldenSkyStories.rb +1 -1
  148. data/lib/bcdice/game_system/Gorilla.rb +1 -1
  149. data/lib/bcdice/game_system/GranCrest.rb +2 -3
  150. data/lib/bcdice/game_system/GundogRevised.rb +1 -1
  151. data/lib/bcdice/game_system/GundogZero.rb +1 -1
  152. data/lib/bcdice/game_system/GurpsFW.rb +2 -3
  153. data/lib/bcdice/game_system/HarnMaster.rb +2 -2
  154. data/lib/bcdice/game_system/HatsuneMiku.rb +1 -2
  155. data/lib/bcdice/game_system/HouraiGakuen.rb +1 -1
  156. data/lib/bcdice/game_system/HuntersMoon.rb +1 -2
  157. data/lib/bcdice/game_system/Illusio.rb +2 -2
  158. data/lib/bcdice/game_system/Insane.rb +90 -717
  159. data/lib/bcdice/game_system/Insane_Korean.rb +7 -719
  160. data/lib/bcdice/game_system/Kamigakari.rb +47 -242
  161. data/lib/bcdice/game_system/Kamigakari_Korean.rb +6 -394
  162. data/lib/bcdice/game_system/KanColle.rb +3 -3
  163. data/lib/bcdice/game_system/KemonoNoMori.rb +1 -1
  164. data/lib/bcdice/game_system/KillDeathBusiness.rb +162 -1144
  165. data/lib/bcdice/game_system/KillDeathBusiness_Korean.rb +6 -1459
  166. data/lib/bcdice/game_system/KurayamiCrying.rb +1 -1
  167. data/lib/bcdice/game_system/LiveraDoll.rb +2 -2
  168. data/lib/bcdice/game_system/LogHorizon.rb +350 -3379
  169. data/lib/bcdice/game_system/LogHorizon_Korean.rb +55 -1357
  170. data/lib/bcdice/game_system/LostRecord.rb +0 -1
  171. data/lib/bcdice/game_system/LostRoyal.rb +1 -2
  172. data/lib/bcdice/game_system/MagicaLogia.rb +158 -1044
  173. data/lib/bcdice/game_system/MeikyuDays.rb +1 -2
  174. data/lib/bcdice/game_system/MeikyuKingdom.rb +4 -4
  175. data/lib/bcdice/game_system/MeikyuKingdomBasic.rb +4 -5
  176. data/lib/bcdice/game_system/MetalHead.rb +1 -1
  177. data/lib/bcdice/game_system/MetalHeadExtream.rb +2 -2
  178. data/lib/bcdice/game_system/MetallicGuardian.rb +1 -1
  179. data/lib/bcdice/game_system/MonotoneMuseum.rb +38 -239
  180. data/lib/bcdice/game_system/MonotoneMuseum_Korean.rb +10 -270
  181. data/lib/bcdice/game_system/NSSQ.rb +159 -0
  182. data/lib/bcdice/game_system/Nechronica.rb +34 -73
  183. data/lib/bcdice/game_system/Nechronica_Korean.rb +11 -128
  184. data/lib/bcdice/game_system/NeverCloud.rb +1 -1
  185. data/lib/bcdice/game_system/NightWizard.rb +1 -1
  186. data/lib/bcdice/game_system/NightWizard3rd.rb +1 -1
  187. data/lib/bcdice/game_system/NinjaSlayer.rb +12 -11
  188. data/lib/bcdice/game_system/NjslyrBattle.rb +1 -1
  189. data/lib/bcdice/game_system/OneWayHeroics.rb +1 -2
  190. data/lib/bcdice/game_system/OracleEngine.rb +1 -1
  191. data/lib/bcdice/game_system/OrgaRain.rb +2 -2
  192. data/lib/bcdice/game_system/Paradiso.rb +1 -1
  193. data/lib/bcdice/game_system/Paranoia.rb +1 -1
  194. data/lib/bcdice/game_system/ParanoiaRebooted.rb +1 -1
  195. data/lib/bcdice/game_system/ParasiteBlood.rb +1 -1
  196. data/lib/bcdice/game_system/Peekaboo.rb +22 -122
  197. data/lib/bcdice/game_system/Postman.rb +2 -2
  198. data/lib/bcdice/game_system/PulpCthulhu.rb +3 -3
  199. data/lib/bcdice/game_system/Raisondetre.rb +2 -2
  200. data/lib/bcdice/game_system/RecordOfLodossWar.rb +1 -1
  201. data/lib/bcdice/game_system/RecordOfSteam.rb +1 -1
  202. data/lib/bcdice/game_system/RokumonSekai2.rb +1 -1
  203. data/lib/bcdice/game_system/RuinBreakers.rb +296 -0
  204. data/lib/bcdice/game_system/Ryutama.rb +1 -1
  205. data/lib/bcdice/game_system/SRS.rb +1 -2
  206. data/lib/bcdice/game_system/SamsaraBallad.rb +1 -1
  207. data/lib/bcdice/game_system/Satasupe.rb +1 -2
  208. data/lib/bcdice/game_system/ScreamHighSchool.rb +2 -2
  209. data/lib/bcdice/game_system/SevenFortressMobius.rb +1 -1
  210. data/lib/bcdice/game_system/ShadowRun5.rb +2 -2
  211. data/lib/bcdice/game_system/SharedFantasia.rb +1 -1
  212. data/lib/bcdice/game_system/ShinMegamiTenseiKakuseihen.rb +1 -1
  213. data/lib/bcdice/game_system/ShinkuuGakuen.rb +2 -2
  214. data/lib/bcdice/game_system/ShinobiGami.rb +1 -2
  215. data/lib/bcdice/game_system/ShoujoTenrankai.rb +2 -2
  216. data/lib/bcdice/game_system/Skynauts.rb +1 -1
  217. data/lib/bcdice/game_system/SteamPunkers.rb +1 -1
  218. data/lib/bcdice/game_system/StellarKnights.rb +1 -2
  219. data/lib/bcdice/game_system/SterileLife.rb +1 -1
  220. data/lib/bcdice/game_system/StrangerOfSwordCity.rb +1 -2
  221. data/lib/bcdice/game_system/StratoShout.rb +44 -247
  222. data/lib/bcdice/game_system/StratoShout_Korean.rb +6 -282
  223. data/lib/bcdice/game_system/Strave.rb +2 -2
  224. data/lib/bcdice/game_system/SwordWorld.rb +8 -9
  225. data/lib/bcdice/game_system/SwordWorld2_0.rb +2 -3
  226. data/lib/bcdice/game_system/SwordWorld2_5.rb +2 -3
  227. data/lib/bcdice/game_system/TherapieSein.rb +1 -1
  228. data/lib/bcdice/game_system/TokumeiTenkousei.rb +1 -1
  229. data/lib/bcdice/game_system/TokyoGhostResearch.rb +2 -2
  230. data/lib/bcdice/game_system/Torg.rb +2 -2
  231. data/lib/bcdice/game_system/Torg1_5.rb +1 -1
  232. data/lib/bcdice/game_system/TorgEternity.rb +1 -1
  233. data/lib/bcdice/game_system/TrinitySeven.rb +1 -1
  234. data/lib/bcdice/game_system/TunnelsAndTrolls.rb +1 -1
  235. data/lib/bcdice/game_system/TwilightGunsmoke.rb +1 -2
  236. data/lib/bcdice/game_system/UnsungDuet.rb +139 -0
  237. data/lib/bcdice/game_system/Utakaze.rb +1 -1
  238. data/lib/bcdice/game_system/VampireTheMasquerade5th.rb +1 -1
  239. data/lib/bcdice/game_system/Villaciel.rb +1 -2
  240. data/lib/bcdice/game_system/Warhammer.rb +1 -1
  241. data/lib/bcdice/game_system/Warhammer4.rb +329 -0
  242. data/lib/bcdice/game_system/WitchQuest.rb +1 -1
  243. data/lib/bcdice/game_system/WorldOfDarkness.rb +1 -1
  244. data/lib/bcdice/game_system/YankeeYogSothoth.rb +15 -15
  245. data/lib/bcdice/game_system/YearZeroEngine.rb +1 -1
  246. data/lib/bcdice/game_system/ZettaiReido.rb +1 -1
  247. data/lib/bcdice/game_system/filled_with/cook_tables.rb +119 -0
  248. data/lib/bcdice/game_system/filled_with/lot_tables.rb +155 -0
  249. data/lib/bcdice/loader.rb +6 -8
  250. data/lib/bcdice/preprocessor.rb +15 -40
  251. data/lib/bcdice/repl.rb +1 -1
  252. data/lib/bcdice/result.rb +83 -0
  253. data/lib/bcdice/translate.rb +11 -0
  254. data/lib/bcdice/version.rb +1 -1
  255. metadata +80 -4
@@ -3,6 +3,7 @@ require "bcdice/common_command/barabara_dice"
3
3
  require "bcdice/common_command/calc"
4
4
  require "bcdice/common_command/choice"
5
5
  require "bcdice/common_command/d66_dice"
6
+ require "bcdice/common_command/repeat"
6
7
  require "bcdice/common_command/reroll_dice"
7
8
  require "bcdice/common_command/upper_dice"
8
9
  require "bcdice/common_command/version"
@@ -15,6 +16,7 @@ module BCDice
15
16
  Calc,
16
17
  Choice,
17
18
  D66Dice,
19
+ Repeat,
18
20
  RerollDice,
19
21
  UpperDice,
20
22
  Version,
@@ -4,50 +4,14 @@ require "bcdice/common_command/add_dice/randomizer"
4
4
 
5
5
  module BCDice
6
6
  module CommonCommand
7
- class AddDice
7
+ module AddDice
8
8
  PREFIX_PATTERN = /[\+\-\dD\(\[]+/.freeze
9
9
 
10
- def initialize(command, randomizer, game_system)
11
- @command = command
12
- @bcdice = randomizer
13
- @diceBot = game_system
14
-
15
- @dice_list = []
16
- @is_secret = false
17
- end
18
-
19
- def secret?
20
- @is_secret
21
- end
22
-
23
- def eval()
24
- parser = Parser.new(@command)
25
-
26
- command = parser.parse()
27
- if parser.error?
28
- return nil
10
+ class << self
11
+ def eval(command, game_system, randomizer)
12
+ cmd = Parser.parse(command)
13
+ cmd&.eval(game_system, randomizer)
29
14
  end
30
-
31
- randomizer = Randomizer.new(@bcdice, @diceBot, command.cmp_op)
32
- total = command.lhs.eval(randomizer)
33
-
34
- output =
35
- if randomizer.dice_list.size <= 1 && command.lhs.is_a?(Node::DiceRoll)
36
- "(#{command}) > #{total}"
37
- else
38
- "(#{command}) > #{command.lhs.output} > #{total}"
39
- end
40
-
41
- dice_list = randomizer.dice_list
42
-
43
- if command.cmp_op
44
- dice_total = dice_list.inject(&:+)
45
- output += @diceBot.check_result(total, dice_total, dice_list, randomizer.sides, command.cmp_op, command.rhs)
46
- end
47
-
48
- @is_secret = parser.secret?
49
-
50
- return output
51
15
  end
52
16
  end
53
17
  end
@@ -1,8 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "singleton"
4
+
3
5
  module BCDice
4
6
  module CommonCommand
5
- class AddDice
7
+ module AddDice
6
8
  # 加算ロールの構文解析木のノードを格納するモジュール
7
9
  module Node
8
10
  # 加算ロールコマンドのノード。
@@ -24,7 +26,8 @@ module BCDice
24
26
  # @param [Object] lhs 左辺のノード
25
27
  # @param [Symbol] cmp_op 比較演算子
26
28
  # @param [Integer, String] rhs 右辺のノード
27
- def initialize(lhs, cmp_op, rhs)
29
+ def initialize(secret, lhs, cmp_op = nil, rhs = nil)
30
+ @secret = secret
28
31
  @lhs = lhs
29
32
  @cmp_op = cmp_op
30
33
  @rhs = rhs
@@ -33,19 +36,48 @@ module BCDice
33
36
  # 文字列に変換する
34
37
  # @return [String]
35
38
  def to_s
36
- @lhs.to_s + cmp_op_text + @rhs.to_s
39
+ @lhs.to_s + cmp_op_text + @rhs&.eval(nil).to_s
37
40
  end
38
41
 
39
42
  # ノードのS式を返す
40
43
  # @return [String]
41
44
  def s_exp
42
45
  if @cmp_op
43
- "(Command (#{@cmp_op} #{@lhs.s_exp} #{@rhs}))"
46
+ "(Command (#{@cmp_op} #{@lhs.s_exp} #{@rhs.s_exp}))"
44
47
  else
45
48
  "(Command #{@lhs.s_exp})"
46
49
  end
47
50
  end
48
51
 
52
+ def eval(game_system, randomizer)
53
+ randomizer = Randomizer.new(randomizer, game_system)
54
+ total = @lhs.eval(randomizer)
55
+
56
+ interrim_expr =
57
+ unless randomizer.rand_results.size <= 1 && @lhs.is_a?(Node::DiceRoll)
58
+ @lhs.output
59
+ end
60
+
61
+ result =
62
+ if @cmp_op
63
+ rhs = @rhs.eval(nil)
64
+ game_system.check_result(total, randomizer.rand_results, @cmp_op, rhs)
65
+ end
66
+ result ||= Result.new
67
+
68
+ sequence = [
69
+ "(#{self})",
70
+ interrim_expr,
71
+ total,
72
+ result&.text
73
+ ].compact
74
+
75
+ result.tap do |r|
76
+ r.secret = @secret
77
+ r.text = sequence.join(" > ")
78
+ end
79
+ end
80
+
49
81
  private
50
82
 
51
83
  # メッセージ中で比較演算子をどのように表示するかを返す
@@ -62,6 +94,25 @@ module BCDice
62
94
  end
63
95
  end
64
96
 
97
+ class UndecidedTarget
98
+ include Singleton
99
+
100
+ def eval(_randomizer)
101
+ "?"
102
+ end
103
+
104
+ def include_dice?
105
+ false
106
+ end
107
+
108
+ def to_s
109
+ "?"
110
+ end
111
+
112
+ alias output to_s
113
+ alias s_exp to_s
114
+ end
115
+
65
116
  # 二項演算子のノード
66
117
  class BinaryOp
67
118
  # ノードを初期化する
@@ -87,6 +138,11 @@ module BCDice
87
138
  return calc(lhs, rhs)
88
139
  end
89
140
 
141
+ # @return [Boolean]
142
+ def include_dice?
143
+ @lhs.include_dice? || @rhs.include_dice?
144
+ end
145
+
90
146
  # 文字列に変換する
91
147
  # @return [String]
92
148
  def to_s
@@ -258,6 +314,11 @@ module BCDice
258
314
  -@body.eval(randomizer)
259
315
  end
260
316
 
317
+ # @return [Boolean]
318
+ def include_dice?
319
+ @body.include_dice?
320
+ end
321
+
261
322
  # 文字列に変換する
262
323
  # @return [String]
263
324
  def to_s
@@ -283,8 +344,8 @@ module BCDice
283
344
  # @param [Number] times ダイスを振る回数のノード
284
345
  # @param [Number] sides ダイスの面数のノード
285
346
  def initialize(times, sides)
286
- @times = times.literal
287
- @sides = sides.literal
347
+ @times = times.eval(nil)
348
+ @sides = sides.eval(nil)
288
349
 
289
350
  # ダイスを振った結果の出力
290
351
  @text = nil
@@ -298,19 +359,19 @@ module BCDice
298
359
  # @param [Randomizer] randomizer ランダマイザ
299
360
  # @return [Integer] 評価結果(出目の合計値)
300
361
  def eval(randomizer)
301
- dice_groups = randomizer.roll(@times, @sides)
302
-
303
- # TODO: Ruby 2.4以降では Array#sum が使える
304
- total = dice_groups.flatten.reduce(0, &:+)
362
+ dice_list = randomizer.roll(@times, @sides)
305
363
 
306
- dice_str = dice_groups
307
- .map { |dice_list| "[#{dice_list.join(',')}]" }
308
- .join
309
- @text = "#{total}#{dice_str}"
364
+ total = dice_list.sum()
365
+ @text = "#{total}[#{dice_list.join(',')}]"
310
366
 
311
367
  return total
312
368
  end
313
369
 
370
+ # @return [Boolean]
371
+ def include_dice?
372
+ true
373
+ end
374
+
314
375
  # 文字列に変換する
315
376
  # @return [String]
316
377
  def to_s
@@ -391,16 +452,21 @@ module BCDice
391
452
  # @param [Randomizer] randomizer ランダマイザ
392
453
  # @return [Integer] 評価結果(出目の合計値)
393
454
  def eval(randomizer)
394
- sorted_values = randomizer.roll_once(@times, @sides).sort
455
+ sorted_values = randomizer.roll(@times, @sides).sort
395
456
  total = @filter
396
457
  .apply[sorted_values, @n_filtering]
397
- .reduce(0, &:+)
458
+ .sum()
398
459
 
399
460
  @text = "#{total}[#{sorted_values.join(',')}]"
400
461
 
401
462
  return total
402
463
  end
403
464
 
465
+ # @return [Boolean]
466
+ def include_dice?
467
+ true
468
+ end
469
+
404
470
  # 文字列に変換する
405
471
  # @return [String]
406
472
  def to_s
@@ -433,6 +499,11 @@ module BCDice
433
499
  @expr.eval(randomizer)
434
500
  end
435
501
 
502
+ # @return [Boolean]
503
+ def include_dice?
504
+ @expr.include_dice?
505
+ end
506
+
436
507
  # @return [String]
437
508
  def to_s
438
509
  "(#{@expr})"
@@ -473,6 +544,11 @@ module BCDice
473
544
  @literal
474
545
  end
475
546
 
547
+ # @return [Boolean]
548
+ def include_dice?
549
+ false
550
+ end
551
+
476
552
  # 文字列に変換する
477
553
  # @return [String]
478
554
  def to_s
@@ -1,282 +1,382 @@
1
- # frozen_string_literal: true
1
+ #
2
+ # DO NOT MODIFY!!!!
3
+ # This file is automatically generated by Racc 1.5.1
4
+ # from Racc grammar file "".
5
+ #
2
6
 
3
- require "bcdice/arithmetic_evaluator"
4
- require "bcdice/normalize"
7
+ require 'racc/parser.rb'
8
+
9
+
10
+ require "bcdice/common_command/lexer"
5
11
  require "bcdice/common_command/add_dice/node"
6
12
 
7
13
  module BCDice
8
14
  module CommonCommand
9
- class AddDice
10
- # 加算ロールの構文解析器のクラス
11
- class Parser
12
- # 構文解析器を初期化する
13
- # @param [String] expr 構文解析対象の文字列
14
- def initialize(expr)
15
- # 構文解析対象の文字列
16
- @expr = expr
17
- # 読み込んだトークンのインデックス
18
- @idx = 0
19
- # 構文解析エラーが発生したかどうか
20
- @error = false
21
- # 式にダイスロールが含まれるか
22
- @contain_dice_roll = false
23
-
24
- @is_secret = false
25
- end
26
-
27
- def secret?
28
- @is_secret
29
- end
30
-
31
- # 構文解析を実行する
32
- # @return [Node::Command, nil] 加算ロールコマンド
33
- def parse()
34
- lhs, cmp_op, rhs = @expr.partition(/[<>=]+/)
35
-
36
- cmp_op = Normalize.comparison_operator(cmp_op)
37
- if cmp_op && rhs.empty?
38
- @error = true
39
- return nil
40
- end
41
-
42
- if !rhs.empty? && rhs != "?"
43
- ae = ArithmeticEvaluator.new(rhs)
44
- rhs = ae.eval()
45
-
46
- @error = ae.error?
47
- end
48
-
49
- @tokens = tokenize(lhs)
50
- lhs = expr()
51
-
52
- if @idx != @tokens.size || !@contain_dice_roll
53
- @error = true
54
- end
55
-
56
- return AddDice::Node::Command.new(lhs, cmp_op, rhs)
57
- end
58
-
59
- # 構文解析エラーが発生したかどうかを返す
60
- # @return [Boolean]
61
- def error?
62
- @error
63
- end
64
-
65
- private
66
-
67
- # 構文解析対象の文字列をトークンの配列に変換する
68
- # @return [Array<String>]
69
- def tokenize(expr)
70
- expr.gsub(%r{[\+\-\*/DURSKHL@()]}) { |e| " #{e} " }.split(" ")
71
- end
72
-
73
- # 式
74
- def expr
75
- @is_secret = consume("S")
76
-
77
- return add()
78
- end
79
-
80
- # 加算、減算
81
- def add
82
- node = mul()
83
-
84
- loop do
85
- if consume("+")
86
- op, rhs = sub_negative_number(:+, mul())
87
- node = AddDice::Node::BinaryOp.new(node, op, rhs)
88
- elsif consume("-")
89
- op, rhs = sub_negative_number(:-, mul())
90
- node = AddDice::Node::BinaryOp.new(node, op, rhs)
91
- else
92
- break
93
- end
94
- end
95
-
96
- return node
97
- end
98
-
99
- # TODO: 処理の説明を書く
100
- def sub_negative_number(op, rhs)
101
- if rhs.is_a?(Node::Number) && rhs.literal < 0
102
- if op == :+
103
- return [:-, rhs.negate]
104
- elsif op == :-
105
- return [:+, rhs.negate]
106
- end
107
- end
108
-
109
- [op, rhs]
110
- end
111
-
112
- # 乗算、除算
113
- def mul
114
- node = unary()
115
-
116
- loop do
117
- if consume("*")
118
- node = AddDice::Node::BinaryOp.new(node, :*, unary())
119
- elsif consume("/")
120
- rhs = unary()
121
- klass = divide_node_class()
122
- node = klass.new(node, rhs)
123
- else
124
- break
125
- end
126
- end
127
-
128
- return node
129
- end
130
-
131
- # 端数処理方法を示す記号を読み込み、対応する除算ノードのクラスを返す
132
- # @return [Class] 除算ノードのクラス
133
- def divide_node_class
134
- if consume("U")
135
- # 切り上げ
136
- Node::DivideWithRoundingUp
137
- elsif consume("R")
138
- # 四捨五入
139
- Node::DivideWithRoundingOff
140
- else
141
- # 切り捨て
142
- Node::DivideWithRoundingDown
143
- end
144
- end
145
-
146
- # 単項演算
147
- def unary
148
- if consume("+")
149
- unary()
150
- elsif consume("-")
151
- node = unary()
152
-
153
- case node
154
- when Node::Negate
155
- node.body
156
- when Node::Number
157
- node.negate()
158
- else
159
- AddDice::Node::Negate.new(node)
160
- end
161
- else
162
- term()
163
- end
164
- end
165
-
166
- # カッコ、ダイスロール
167
- def term
168
- if consume("(")
169
- node = AddDice::Node::Parenthesis.new(add())
170
- expect(")")
171
-
172
- return node
173
- else
174
- dice_notation()
175
- end
176
- end
177
-
178
- # ダイスロール、数値
179
- def dice_notation
180
- num = expect_number()
181
- if consume("D")
182
- times = num
183
- sides = expect_number()
184
-
185
- filter = dice_roll_filter()
186
- if filter
187
- # ダイスロール後のフィルタリングあり
188
- n_filtering = expect_number()
189
- @contain_dice_roll = true
190
- return Node::DiceRollWithFilter.new(times, sides, n_filtering, filter)
191
- end
192
-
193
- # 通常のダイスロール
194
- @contain_dice_roll = true
195
- return Node::DiceRoll.new(times, sides)
196
- end
197
-
198
- return num
199
- end
200
-
201
- # ダイスロール:フィルタ処理
202
- def dice_roll_filter
203
- if consume("K", "H")
204
- # 大きな出目から複数個取る
205
- Node::DiceRollWithFilter::KEEP_HIGHEST
206
- elsif consume("K", "L")
207
- # 小さな出目から複数個取る
208
- Node::DiceRollWithFilter::KEEP_LOWEST
209
- elsif consume("D", "H")
210
- # 大きな出目から複数個除く
211
- Node::DiceRollWithFilter::DROP_HIGHEST
212
- elsif consume("D", "L")
213
- # 小さな出目から複数個除く
214
- Node::DiceRollWithFilter::DROP_LOWEST
215
- end
216
- end
217
-
218
- # トークンを消費する
219
- #
220
- # トークンと期待した文字列が合致していた場合、次のトークンに進む。
221
- # 合致していなかった場合は、進まない。
222
- #
223
- # @param [String] expected 期待する文字列
224
- # @return [true] トークンと期待した文字列が合致していた場合
225
- # @return [false] トークンと期待した文字列が合致していなかった場合
226
- def consume(*expected)
227
- target = @tokens.slice(@idx, expected.length)
228
- unless target == expected
229
- return false
230
- end
231
-
232
- @idx += expected.length
233
- return true
234
- end
235
-
236
- # 指定された文字列のトークンを要求する
237
- #
238
- # トークンと期待した文字列が合致していなかった場合、エラーとする。
239
- # エラーの有無にかかわらず、次のトークンに進む。
240
- #
241
- # @param [String] str 期待する文字列
242
- # @return [void]
243
- def expect(str)
244
- if @tokens[@idx] != str
245
- @error = true
246
- end
247
-
248
- @idx += 1
249
- end
250
-
251
- # 整数のトークンを要求する
252
- #
253
- # 整数のトークンならば、対応する整数のノードを返す。
254
- # そうでなければエラーとし、整数0のノードを返す。
255
- #
256
- # エラーの有無にかかわらず、次のトークンに進む。
257
- #
258
- # @return [Node::Number] 整数のノード
259
- def expect_number()
260
- unless integer?(@tokens[@idx])
261
- @error = true
262
- @idx += 1
263
- return AddDice::Node::Number.new(0)
264
- end
265
-
266
- ret = @tokens[@idx].to_i
267
- @idx += 1
268
- return AddDice::Node::Number.new(ret)
269
- end
270
-
271
- # 文字列が整数かどうかを返す
272
- # @param [String] str 対象文字列
273
- # @return [Boolean]
274
- def integer?(str)
275
- # Ruby 1.9 以降では Kernel.#Integer を使うべき
276
- # Ruby 1.8 にもあるが、基数を指定できない問題がある
277
- !/^\d+$/.match(str).nil?
278
- end
279
- end
15
+ module AddDice
16
+ class Parser < Racc::Parser
17
+
18
+
19
+ def self.parse(source)
20
+ new.parse(source)
21
+ end
22
+
23
+ def parse(source)
24
+ @lexer = Lexer.new(source)
25
+ do_parse()
26
+ rescue ParseError
27
+ nil
28
+ end
29
+
30
+ private
31
+
32
+ def next_token
33
+ @lexer.next_token
34
+ end
35
+
36
+ # 加減算の右辺が負数である場合に加減算を逆転させる
37
+ def expand_negate(op, rhs)
38
+ if rhs.is_a?(Node::Negate)
39
+ if op == :+
40
+ return [:-, rhs.body]
41
+ elsif op == :-
42
+ return [:+, rhs.body]
280
43
  end
281
44
  end
45
+
46
+ [op, rhs]
47
+ end
48
+ ##### State transition tables begin ###
49
+
50
+ racc_action_table = [
51
+ 13, 16, 17, 18, 19, 13, 32, 13, 3, 8,
52
+ 9, 4, 13, 12, 13, 26, 8, 9, 12, 13,
53
+ 12, 8, 9, 8, 9, 12, 13, 12, 8, 9,
54
+ 14, 13, 12, 13, 22, 8, 9, 13, 13, 12,
55
+ 8, 9, 8, 9, 12, 15, 12, 8, 9, nil,
56
+ 12, 12, nil, 16, 17, 16, 17, 18, 19, 18,
57
+ 19, 34, 35, 38, 37, 40, 41, 42, 43 ]
58
+
59
+ racc_action_check = [
60
+ 15, 23, 23, 6, 6, 22, 23, 2, 0, 15,
61
+ 15, 1, 8, 15, 9, 15, 2, 2, 22, 12,
62
+ 2, 8, 8, 9, 9, 8, 16, 9, 12, 12,
63
+ 4, 17, 12, 18, 11, 16, 16, 36, 19, 16,
64
+ 17, 17, 18, 18, 17, 5, 18, 19, 19, nil,
65
+ 36, 19, nil, 5, 5, 25, 25, 27, 27, 28,
66
+ 28, 30, 30, 31, 31, 37, 37, 38, 38 ]
67
+
68
+ racc_action_pointer = [
69
+ 4, 11, 5, nil, 30, 42, -10, nil, 10, 12,
70
+ nil, 29, 17, nil, nil, -2, 24, 29, 31, 36,
71
+ nil, nil, 3, -10, nil, 44, nil, 44, 46, nil,
72
+ 52, 58, nil, nil, nil, nil, 35, 58, 60, nil,
73
+ nil, nil, nil, nil ]
74
+
75
+ racc_action_default = [
76
+ -3, -29, -29, -4, -29, -1, -9, -12, -29, -29,
77
+ -18, -22, -29, -28, 44, -29, -29, -29, -29, -29,
78
+ -16, -17, -20, -29, -2, -5, -6, -7, -8, -10,
79
+ -13, -19, -27, -11, -14, -15, -29, -29, -29, -21,
80
+ -23, -24, -25, -26 ]
81
+
82
+ racc_goto_table = [
83
+ 31, 1, 5, 27, 28, 2, 20, 21, 24, 33,
84
+ 36, nil, 23, nil, 39, 25, 29, 30 ]
85
+
86
+ racc_goto_check = [
87
+ 9, 1, 3, 5, 5, 2, 6, 6, 4, 7,
88
+ 10, nil, 3, nil, 9, 3, 6, 6 ]
89
+
90
+ racc_goto_pointer = [
91
+ nil, 1, 5, 0, -7, -13, -2, -21, nil, -22,
92
+ -21 ]
93
+
94
+ racc_goto_default = [
95
+ nil, nil, nil, nil, nil, 6, 7, nil, 10, 11,
96
+ nil ]
97
+
98
+ racc_reduce_table = [
99
+ 0, 0, :racc_error,
100
+ 2, 19, :_reduce_1,
101
+ 4, 19, :_reduce_2,
102
+ 0, 20, :_reduce_3,
103
+ 1, 20, :_reduce_4,
104
+ 1, 22, :_reduce_none,
105
+ 1, 22, :_reduce_6,
106
+ 3, 21, :_reduce_7,
107
+ 3, 21, :_reduce_8,
108
+ 1, 21, :_reduce_none,
109
+ 3, 23, :_reduce_10,
110
+ 4, 23, :_reduce_11,
111
+ 1, 23, :_reduce_none,
112
+ 0, 25, :_reduce_13,
113
+ 1, 25, :_reduce_14,
114
+ 1, 25, :_reduce_15,
115
+ 2, 24, :_reduce_16,
116
+ 2, 24, :_reduce_17,
117
+ 1, 24, :_reduce_none,
118
+ 3, 26, :_reduce_19,
119
+ 2, 26, :_reduce_20,
120
+ 5, 26, :_reduce_21,
121
+ 1, 26, :_reduce_none,
122
+ 2, 28, :_reduce_23,
123
+ 2, 28, :_reduce_24,
124
+ 2, 28, :_reduce_25,
125
+ 2, 28, :_reduce_26,
126
+ 3, 27, :_reduce_27,
127
+ 1, 27, :_reduce_28 ]
128
+
129
+ racc_reduce_n = 29
130
+
131
+ racc_shift_n = 44
132
+
133
+ racc_token_table = {
134
+ false => 0,
135
+ :error => 1,
136
+ :NUMBER => 2,
137
+ :CMP_OP => 3,
138
+ :S => 4,
139
+ :D => 5,
140
+ :K => 6,
141
+ :H => 7,
142
+ :L => 8,
143
+ :U => 9,
144
+ :R => 10,
145
+ :PLUS => 11,
146
+ :MINUS => 12,
147
+ :ASTERISK => 13,
148
+ :SLASH => 14,
149
+ :PARENL => 15,
150
+ :PARENR => 16,
151
+ :QUESTION => 17 }
152
+
153
+ racc_nt_base = 18
154
+
155
+ racc_use_result_var = true
156
+
157
+ Racc_arg = [
158
+ racc_action_table,
159
+ racc_action_check,
160
+ racc_action_default,
161
+ racc_action_pointer,
162
+ racc_goto_table,
163
+ racc_goto_check,
164
+ racc_goto_default,
165
+ racc_goto_pointer,
166
+ racc_nt_base,
167
+ racc_reduce_table,
168
+ racc_token_table,
169
+ racc_shift_n,
170
+ racc_reduce_n,
171
+ racc_use_result_var ]
172
+
173
+ Racc_token_to_s_table = [
174
+ "$end",
175
+ "error",
176
+ "NUMBER",
177
+ "CMP_OP",
178
+ "S",
179
+ "D",
180
+ "K",
181
+ "H",
182
+ "L",
183
+ "U",
184
+ "R",
185
+ "PLUS",
186
+ "MINUS",
187
+ "ASTERISK",
188
+ "SLASH",
189
+ "PARENL",
190
+ "PARENR",
191
+ "QUESTION",
192
+ "$start",
193
+ "command",
194
+ "secret",
195
+ "add",
196
+ "target",
197
+ "mul",
198
+ "unary",
199
+ "round_type",
200
+ "dice",
201
+ "term",
202
+ "filter_type" ]
203
+
204
+ Racc_debug_parser = false
205
+
206
+ ##### State transition tables end #####
207
+
208
+ # reduce 0 omitted
209
+
210
+ def _reduce_1(val, _values, result)
211
+ secret, lhs = val
212
+ raise ParseError unless lhs.include_dice?
213
+
214
+ result = Node::Command.new(secret, lhs)
215
+
216
+ result
217
+ end
218
+
219
+ def _reduce_2(val, _values, result)
220
+ secret, lhs, cmp_op, rhs = val
221
+ raise ParseError if !lhs.include_dice? || rhs.include_dice? || cmp_op.nil?
222
+
223
+ result = Node::Command.new(secret, lhs, cmp_op, rhs)
224
+
225
+ result
226
+ end
227
+
228
+ def _reduce_3(val, _values, result)
229
+ result = false
230
+ result
231
+ end
232
+
233
+ def _reduce_4(val, _values, result)
234
+ result = true
235
+ result
236
+ end
237
+
238
+ # reduce 5 omitted
239
+
240
+ def _reduce_6(val, _values, result)
241
+ result = Node::UndecidedTarget.instance
242
+ result
243
+ end
244
+
245
+ def _reduce_7(val, _values, result)
246
+ lhs = val[0]
247
+ op, rhs = expand_negate(:+, val[2])
248
+ result = Node::BinaryOp.new(lhs, op, rhs)
249
+
250
+ result
251
+ end
252
+
253
+ def _reduce_8(val, _values, result)
254
+ lhs = val[0]
255
+ op, rhs = expand_negate(:-, val[2])
256
+ result = Node::BinaryOp.new(lhs, op, rhs)
257
+
258
+ result
259
+ end
260
+
261
+ # reduce 9 omitted
262
+
263
+ def _reduce_10(val, _values, result)
264
+ lhs = val[0]
265
+ rhs = val[2]
266
+ result = Node::BinaryOp.new(lhs, :*, rhs)
267
+
268
+ result
269
+ end
270
+
271
+ def _reduce_11(val, _values, result)
272
+ lhs = val[0]
273
+ rhs = val[2]
274
+ divied_class = val[3]
275
+ result = divied_class.new(lhs, rhs)
276
+
277
+ result
278
+ end
279
+
280
+ # reduce 12 omitted
281
+
282
+ def _reduce_13(val, _values, result)
283
+ result = Node::DivideWithRoundingDown
284
+ result
285
+ end
286
+
287
+ def _reduce_14(val, _values, result)
288
+ result = Node::DivideWithRoundingUp
289
+ result
290
+ end
291
+
292
+ def _reduce_15(val, _values, result)
293
+ result = Node::DivideWithRoundingOff
294
+ result
295
+ end
296
+
297
+ def _reduce_16(val, _values, result)
298
+ result = val[1]
299
+ result
300
+ end
301
+
302
+ def _reduce_17(val, _values, result)
303
+ body = val[1]
304
+ result = body.is_a?(Node::Negate) ? body.body : Node::Negate.new(body)
305
+
306
+ result
282
307
  end
308
+
309
+ # reduce 18 omitted
310
+
311
+ def _reduce_19(val, _values, result)
312
+ times = val[0]
313
+ sides = val[2]
314
+ raise ParseError if times.include_dice? || sides.include_dice?
315
+
316
+ result = Node::DiceRoll.new(times, sides)
317
+
318
+ result
319
+ end
320
+
321
+ def _reduce_20(val, _values, result)
322
+ times = val[0]
323
+ sides = Node::Number.new(6)
324
+ raise ParseError if times.include_dice?
325
+
326
+ result = Node::DiceRoll.new(times, sides)
327
+
328
+ result
329
+ end
330
+
331
+ def _reduce_21(val, _values, result)
332
+ times = val[0]
333
+ sides = val[2]
334
+ filter = val[3]
335
+ n_filtering = val[4]
336
+ raise ParseError if times.include_dice? || sides.include_dice? || n_filtering.include_dice?
337
+
338
+ result = Node::DiceRollWithFilter.new(times, sides, n_filtering, filter)
339
+
340
+ result
341
+ end
342
+
343
+ # reduce 22 omitted
344
+
345
+ def _reduce_23(val, _values, result)
346
+ result = Node::DiceRollWithFilter::KEEP_HIGHEST
347
+ result
348
+ end
349
+
350
+ def _reduce_24(val, _values, result)
351
+ result = Node::DiceRollWithFilter::KEEP_LOWEST
352
+ result
353
+ end
354
+
355
+ def _reduce_25(val, _values, result)
356
+ result = Node::DiceRollWithFilter::DROP_HIGHEST
357
+ result
358
+ end
359
+
360
+ def _reduce_26(val, _values, result)
361
+ result = Node::DiceRollWithFilter::DROP_LOWEST
362
+ result
363
+ end
364
+
365
+ def _reduce_27(val, _values, result)
366
+ result = Node::Parenthesis.new(val[1])
367
+ result
368
+ end
369
+
370
+ def _reduce_28(val, _values, result)
371
+ result = Node::Number.new(val[0])
372
+ result
373
+ end
374
+
375
+ def _reduce_none(val, _values, result)
376
+ val[0]
377
+ end
378
+
379
+ end # class Parser
380
+ end # module AddDice
381
+ end # module CommonCommand
382
+ end # module BCDice