bcdice 3.0.0.pre.alpha.1 → 3.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (316) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +70 -0
  3. data/README.md +34 -7
  4. data/i18n/Amadeus/ja_jp.yml +386 -0
  5. data/i18n/Amadeus/ko_kr.yml +148 -0
  6. data/i18n/Cthulhu/ja_jp.yml +11 -0
  7. data/i18n/Cthulhu/ko_kr.yml +11 -0
  8. data/i18n/Cthulhu/zh_hant.yml +11 -0
  9. data/i18n/DetatokoSaga/ja_jp.yml +75 -0
  10. data/i18n/DetatokoSaga/ko_kr.yml +75 -0
  11. data/i18n/DoubleCross/ja_jp.yml +53 -0
  12. data/i18n/DoubleCross/ko_kr.yml +53 -0
  13. data/i18n/Dracurouge/ja_jp.yml +1374 -0
  14. data/i18n/Dracurouge/ko_kr.yml +295 -0
  15. data/i18n/Fiasco/ja_jp.yml +10 -0
  16. data/i18n/Fiasco/ko_kr.yml +10 -0
  17. data/i18n/FutariSousa/ja_jp.yml +720 -0
  18. data/i18n/FutariSousa/ko_kr.yml +746 -0
  19. data/i18n/Insane/ja_jp.yml +454 -0
  20. data/i18n/Insane/ko_kr.yml +502 -0
  21. data/i18n/Kamigakari/ja_jp.yml +276 -0
  22. data/i18n/Kamigakari/ko_kr.yml +204 -0
  23. data/i18n/KillDeathBusiness/ja_jp.yml +1092 -0
  24. data/i18n/KillDeathBusiness/ko_kr.yml +1063 -0
  25. data/i18n/LogHorizon/ja_jp.yml +3082 -0
  26. data/i18n/LogHorizon/ko_kr.yml +923 -0
  27. data/i18n/MagicaLogia/ja_jp.yml +564 -0
  28. data/i18n/MagicaLogia/ko_kr.yml +564 -0
  29. data/i18n/MonotoneMuseum/ja_jp.yml +561 -0
  30. data/i18n/MonotoneMuseum/ko_kr.yml +89 -0
  31. data/i18n/Nechronica/ja_jp.yml +57 -0
  32. data/i18n/Nechronica/ko_kr.yml +14 -0
  33. data/i18n/StratoShout/ja_jp.yml +160 -0
  34. data/i18n/StratoShout/ko_kr.yml +160 -0
  35. data/i18n/ja_jp.yml +5 -0
  36. data/i18n/ko_kr.yml +7 -0
  37. data/i18n/zh_hant.yml +3 -0
  38. data/lib/bcdice.rb +4 -1
  39. data/lib/bcdice/arithmetic.rb +22 -0
  40. data/lib/bcdice/arithmetic/node.rb +223 -0
  41. data/lib/bcdice/arithmetic/parser.rb +240 -0
  42. data/lib/bcdice/arithmetic_evaluator.rb +7 -156
  43. data/lib/bcdice/base.rb +94 -101
  44. data/lib/bcdice/command/lexer.rb +57 -0
  45. data/lib/bcdice/command/parsed.rb +65 -0
  46. data/lib/bcdice/command/parser.rb +489 -0
  47. data/lib/bcdice/common_command.rb +4 -0
  48. data/lib/bcdice/common_command/add_dice.rb +8 -42
  49. data/lib/bcdice/common_command/add_dice/node.rb +221 -72
  50. data/lib/bcdice/common_command/add_dice/parser.rb +391 -274
  51. data/lib/bcdice/common_command/add_dice/randomizer.rb +27 -33
  52. data/lib/bcdice/common_command/barabara_dice.rb +8 -47
  53. data/lib/bcdice/common_command/barabara_dice/node.rb +92 -0
  54. data/lib/bcdice/common_command/barabara_dice/parser.rb +336 -0
  55. data/lib/bcdice/common_command/barabara_dice/result.rb +22 -0
  56. data/lib/bcdice/common_command/calc.rb +9 -30
  57. data/lib/bcdice/common_command/calc/node.rb +39 -0
  58. data/lib/bcdice/common_command/calc/parser.rb +271 -0
  59. data/lib/bcdice/common_command/choice.rb +137 -19
  60. data/lib/bcdice/common_command/d66_dice.rb +52 -34
  61. data/lib/bcdice/common_command/lexer.rb +47 -0
  62. data/lib/bcdice/common_command/repeat.rb +102 -0
  63. data/lib/bcdice/common_command/reroll_dice.rb +8 -158
  64. data/lib/bcdice/common_command/reroll_dice/node.rb +198 -0
  65. data/lib/bcdice/common_command/reroll_dice/parser.rb +421 -0
  66. data/lib/bcdice/common_command/upper_dice.rb +12 -129
  67. data/lib/bcdice/common_command/upper_dice/node.rb +181 -0
  68. data/lib/bcdice/common_command/upper_dice/parser.rb +433 -0
  69. data/lib/bcdice/common_command/version.rb +11 -17
  70. data/lib/bcdice/deprecated/checker.rb +78 -0
  71. data/lib/bcdice/dice_table.rb +3 -0
  72. data/lib/bcdice/dice_table/chain_table.rb +2 -0
  73. data/lib/bcdice/dice_table/d66_grid_table.rb +10 -0
  74. data/lib/bcdice/dice_table/d66_parity_table.rb +36 -0
  75. data/lib/bcdice/dice_table/d66_range_table.rb +2 -0
  76. data/lib/bcdice/dice_table/d66_table.rb +12 -0
  77. data/lib/bcdice/dice_table/roll_result.rb +2 -0
  78. data/lib/bcdice/dice_table/sai_fic_skill_table.rb +75 -17
  79. data/lib/bcdice/dice_table/sai_fic_skill_table/category.rb +25 -0
  80. data/lib/bcdice/dice_table/sai_fic_skill_table/skill.rb +23 -0
  81. data/lib/bcdice/dice_table/table.rb +10 -0
  82. data/lib/bcdice/enum.rb +2 -0
  83. data/lib/bcdice/format.rb +2 -0
  84. data/lib/bcdice/game_system.rb +17 -1
  85. data/lib/bcdice/game_system/AFF2e.rb +1 -1
  86. data/lib/bcdice/game_system/AceKillerGene.rb +3 -3
  87. data/lib/bcdice/game_system/Airgetlamh.rb +3 -3
  88. data/lib/bcdice/game_system/AlchemiaStruggle.rb +346 -0
  89. data/lib/bcdice/game_system/Alsetto.rb +1 -1
  90. data/lib/bcdice/game_system/Alshard.rb +1 -2
  91. data/lib/bcdice/game_system/AlterRaise.rb +2 -2
  92. data/lib/bcdice/game_system/Amadeus.rb +47 -508
  93. data/lib/bcdice/game_system/Amadeus_Korean.rb +12 -456
  94. data/lib/bcdice/game_system/AngelGear.rb +123 -0
  95. data/lib/bcdice/game_system/AnimaAnimus.rb +2 -6
  96. data/lib/bcdice/game_system/Arianrhod.rb +0 -1
  97. data/lib/bcdice/game_system/ArsMagica.rb +1 -1
  98. data/lib/bcdice/game_system/Avandner.rb +1 -1
  99. data/lib/bcdice/game_system/BBN.rb +7 -5
  100. data/lib/bcdice/game_system/BadLife.rb +2 -2
  101. data/lib/bcdice/game_system/BarnaKronika.rb +1 -1
  102. data/lib/bcdice/game_system/BeastBindTrinity.rb +3 -13
  103. data/lib/bcdice/game_system/BeginningIdol.rb +6 -7
  104. data/lib/bcdice/game_system/BeginningIdol_Korean.rb +6 -7
  105. data/lib/bcdice/game_system/BladeOfArcana.rb +6 -6
  106. data/lib/bcdice/game_system/BlindMythos.rb +12 -10
  107. data/lib/bcdice/game_system/BloodCrusade.rb +54 -81
  108. data/lib/bcdice/game_system/BloodMoon.rb +43 -3
  109. data/lib/bcdice/game_system/CardRanker.rb +24 -65
  110. data/lib/bcdice/game_system/ChaosFlare.rb +4 -4
  111. data/lib/bcdice/game_system/Chill.rb +1 -1
  112. data/lib/bcdice/game_system/CodeLayerd.rb +37 -67
  113. data/lib/bcdice/game_system/ColossalHunter.rb +3 -4
  114. data/lib/bcdice/game_system/Comes.rb +50 -0
  115. data/lib/bcdice/game_system/CrashWorld.rb +1 -1
  116. data/lib/bcdice/game_system/Cthulhu.rb +99 -98
  117. data/lib/bcdice/game_system/Cthulhu7th.rb +117 -370
  118. data/lib/bcdice/game_system/Cthulhu7th_ChineseTraditional.rb +1 -1
  119. data/lib/bcdice/game_system/Cthulhu7th_Korean.rb +1 -1
  120. data/lib/bcdice/game_system/CthulhuTech.rb +8 -15
  121. data/lib/bcdice/game_system/Cthulhu_ChineseTraditional.rb +7 -190
  122. data/lib/bcdice/game_system/Cthulhu_Korean.rb +5 -186
  123. data/lib/bcdice/game_system/DarkBlaze.rb +13 -9
  124. data/lib/bcdice/game_system/DarkDaysDrive.rb +17 -15
  125. data/lib/bcdice/game_system/DarkSouls.rb +1 -1
  126. data/lib/bcdice/game_system/DeadlineHeroes.rb +3 -3
  127. data/lib/bcdice/game_system/DemonParasite.rb +1 -2
  128. data/lib/bcdice/game_system/DesperateRun.rb +163 -0
  129. data/lib/bcdice/game_system/DetatokoSaga.rb +69 -152
  130. data/lib/bcdice/game_system/DetatokoSaga_Korean.rb +9 -277
  131. data/lib/bcdice/game_system/DiceBot.rb +22 -4
  132. data/lib/bcdice/game_system/DiceOfTheDead.rb +9 -6
  133. data/lib/bcdice/game_system/DoubleCross.rb +145 -157
  134. data/lib/bcdice/game_system/DoubleCross_Korean.rb +13 -330
  135. data/lib/bcdice/game_system/Dracurouge.rb +376 -1678
  136. data/lib/bcdice/game_system/Dracurouge_Korean.rb +16 -271
  137. data/lib/bcdice/game_system/EarthDawn.rb +1 -1
  138. data/lib/bcdice/game_system/EarthDawn3.rb +1 -1
  139. data/lib/bcdice/game_system/EarthDawn4.rb +1 -1
  140. data/lib/bcdice/game_system/Elysion.rb +5 -6
  141. data/lib/bcdice/game_system/EmbryoMachine.rb +6 -6
  142. data/lib/bcdice/game_system/Emoklore.rb +131 -0
  143. data/lib/bcdice/game_system/EndBreaker.rb +1 -2
  144. data/lib/bcdice/game_system/EtrianOdysseySRS.rb +1 -2
  145. data/lib/bcdice/game_system/Fiasco.rb +87 -70
  146. data/lib/bcdice/game_system/Fiasco_Korean.rb +7 -95
  147. data/lib/bcdice/game_system/FilledWith.rb +465 -569
  148. data/lib/bcdice/game_system/FullMetalPanic.rb +1 -2
  149. data/lib/bcdice/game_system/FutariSousa.rb +103 -938
  150. data/lib/bcdice/game_system/FutariSousa_Korean.rb +7 -948
  151. data/lib/bcdice/game_system/{Gurps.rb → GURPS.rb} +184 -217
  152. data/lib/bcdice/game_system/Garako.rb +140 -39
  153. data/lib/bcdice/game_system/GardenOrder.rb +3 -3
  154. data/lib/bcdice/game_system/GehennaAn.rb +4 -4
  155. data/lib/bcdice/game_system/GeishaGirlwithKatana.rb +1 -1
  156. data/lib/bcdice/game_system/GoblinSlayer.rb +1 -1
  157. data/lib/bcdice/game_system/GoldenSkyStories.rb +1 -1
  158. data/lib/bcdice/game_system/Gorilla.rb +1 -1
  159. data/lib/bcdice/game_system/GranCrest.rb +2 -3
  160. data/lib/bcdice/game_system/Gundog.rb +1 -1
  161. data/lib/bcdice/game_system/GundogRevised.rb +4 -4
  162. data/lib/bcdice/game_system/GundogZero.rb +3 -3
  163. data/lib/bcdice/game_system/GurpsFW.rb +4 -8
  164. data/lib/bcdice/game_system/HarnMaster.rb +2 -2
  165. data/lib/bcdice/game_system/HatsuneMiku.rb +2 -3
  166. data/lib/bcdice/game_system/HouraiGakuen.rb +1 -1
  167. data/lib/bcdice/game_system/HuntersMoon.rb +17 -111
  168. data/lib/bcdice/game_system/Illusio.rb +27 -36
  169. data/lib/bcdice/game_system/InfiniteBabeL.rb +518 -0
  170. data/lib/bcdice/game_system/Insane.rb +90 -717
  171. data/lib/bcdice/game_system/Insane_Korean.rb +7 -719
  172. data/lib/bcdice/game_system/JekyllAndHyde.rb +42 -0
  173. data/lib/bcdice/game_system/JuinKansen.rb +251 -0
  174. data/lib/bcdice/game_system/Kamigakari.rb +47 -242
  175. data/lib/bcdice/game_system/Kamigakari_Korean.rb +6 -394
  176. data/lib/bcdice/game_system/KanColle.rb +20 -169
  177. data/lib/bcdice/game_system/KemonoNoMori.rb +1 -1
  178. data/lib/bcdice/game_system/KillDeathBusiness.rb +189 -1180
  179. data/lib/bcdice/game_system/KillDeathBusiness_Korean.rb +8 -1460
  180. data/lib/bcdice/game_system/KurayamiCrying.rb +1 -1
  181. data/lib/bcdice/game_system/LiveraDoll.rb +2 -2
  182. data/lib/bcdice/game_system/LogHorizon.rb +350 -3379
  183. data/lib/bcdice/game_system/LogHorizon_Korean.rb +55 -1357
  184. data/lib/bcdice/game_system/LostRecord.rb +0 -1
  185. data/lib/bcdice/game_system/LostRoyal.rb +3 -6
  186. data/lib/bcdice/game_system/MagicaLogia.rb +158 -1044
  187. data/lib/bcdice/game_system/MagicaLogia_Korean.rb +66 -0
  188. data/lib/bcdice/game_system/MeikyuDays.rb +2 -3
  189. data/lib/bcdice/game_system/MeikyuKingdom.rb +7 -7
  190. data/lib/bcdice/game_system/MeikyuKingdomBasic.rb +7 -8
  191. data/lib/bcdice/game_system/MetalHead.rb +1 -1
  192. data/lib/bcdice/game_system/MetalHeadExtream.rb +7 -7
  193. data/lib/bcdice/game_system/MetallicGuardian.rb +1 -2
  194. data/lib/bcdice/game_system/MonotoneMuseum.rb +41 -241
  195. data/lib/bcdice/game_system/MonotoneMuseum_Korean.rb +10 -270
  196. data/lib/bcdice/game_system/NSSQ.rb +159 -0
  197. data/lib/bcdice/game_system/Nechronica.rb +37 -76
  198. data/lib/bcdice/game_system/Nechronica_Korean.rb +11 -128
  199. data/lib/bcdice/game_system/NeverCloud.rb +540 -5
  200. data/lib/bcdice/game_system/NightWizard.rb +2 -2
  201. data/lib/bcdice/game_system/NightWizard3rd.rb +1 -1
  202. data/lib/bcdice/game_system/NightmareHunterDeep.rb +3 -4
  203. data/lib/bcdice/game_system/NinjaSlayer.rb +33 -43
  204. data/lib/bcdice/game_system/NjslyrBattle.rb +1 -1
  205. data/lib/bcdice/game_system/OneWayHeroics.rb +1 -2
  206. data/lib/bcdice/game_system/OracleEngine.rb +14 -18
  207. data/lib/bcdice/game_system/OrgaRain.rb +19 -27
  208. data/lib/bcdice/game_system/Paradiso.rb +3 -3
  209. data/lib/bcdice/game_system/Paranoia.rb +1 -1
  210. data/lib/bcdice/game_system/ParanoiaRebooted.rb +1 -1
  211. data/lib/bcdice/game_system/ParasiteBlood.rb +1 -1
  212. data/lib/bcdice/game_system/Peekaboo.rb +23 -123
  213. data/lib/bcdice/game_system/PhantasmAdventure.rb +0 -4
  214. data/lib/bcdice/game_system/Postman.rb +3 -3
  215. data/lib/bcdice/game_system/PulpCthulhu.rb +3 -3
  216. data/lib/bcdice/game_system/Raisondetre.rb +3 -3
  217. data/lib/bcdice/game_system/RecordOfLodossWar.rb +8 -7
  218. data/lib/bcdice/game_system/RecordOfSteam.rb +1 -1
  219. data/lib/bcdice/game_system/RokumonSekai2.rb +3 -3
  220. data/lib/bcdice/game_system/RuinBreakers.rb +296 -0
  221. data/lib/bcdice/game_system/RyuTuber.rb +6 -4
  222. data/lib/bcdice/game_system/Ryutama.rb +2 -2
  223. data/lib/bcdice/game_system/SRS.rb +1 -7
  224. data/lib/bcdice/game_system/SamsaraBallad.rb +5 -4
  225. data/lib/bcdice/game_system/Satasupe.rb +90 -866
  226. data/lib/bcdice/game_system/ScreamHighSchool.rb +4 -4
  227. data/lib/bcdice/game_system/SevenFortressMobius.rb +1 -1
  228. data/lib/bcdice/game_system/ShadowRun5.rb +2 -2
  229. data/lib/bcdice/game_system/SharedFantasia.rb +1 -1
  230. data/lib/bcdice/game_system/ShinMegamiTenseiKakuseihen.rb +1 -1
  231. data/lib/bcdice/game_system/ShinkuuGakuen.rb +5 -5
  232. data/lib/bcdice/game_system/ShinobiGami.rb +75 -40
  233. data/lib/bcdice/game_system/ShoujoTenrankai.rb +3 -3
  234. data/lib/bcdice/game_system/Skynauts.rb +2 -2
  235. data/lib/bcdice/game_system/SteamPunkers.rb +7 -5
  236. data/lib/bcdice/game_system/StellarKnights.rb +2 -5
  237. data/lib/bcdice/game_system/SterileLife.rb +2 -2
  238. data/lib/bcdice/game_system/StrangerOfSwordCity.rb +2 -3
  239. data/lib/bcdice/game_system/StratoShout.rb +39 -268
  240. data/lib/bcdice/game_system/StratoShout_Korean.rb +8 -283
  241. data/lib/bcdice/game_system/Strave.rb +2 -2
  242. data/lib/bcdice/game_system/SwordWorld.rb +52 -189
  243. data/lib/bcdice/game_system/SwordWorld2_0.rb +21 -150
  244. data/lib/bcdice/game_system/SwordWorld2_5.rb +126 -41
  245. data/lib/bcdice/game_system/TherapieSein.rb +3 -3
  246. data/lib/bcdice/game_system/TokumeiTenkousei.rb +2 -2
  247. data/lib/bcdice/game_system/TokyoGhostResearch.rb +2 -2
  248. data/lib/bcdice/game_system/Torg.rb +3 -3
  249. data/lib/bcdice/game_system/Torg1_5.rb +1 -1
  250. data/lib/bcdice/game_system/TorgEternity.rb +5 -8
  251. data/lib/bcdice/game_system/TrinitySeven.rb +3 -3
  252. data/lib/bcdice/game_system/TunnelsAndTrolls.rb +7 -7
  253. data/lib/bcdice/game_system/TwilightGunsmoke.rb +2 -3
  254. data/lib/bcdice/game_system/UnsungDuet.rb +139 -0
  255. data/lib/bcdice/game_system/Utakaze.rb +2 -2
  256. data/lib/bcdice/game_system/VampireTheMasquerade5th.rb +1 -1
  257. data/lib/bcdice/game_system/Villaciel.rb +1 -2
  258. data/lib/bcdice/game_system/Warhammer.rb +7 -7
  259. data/lib/bcdice/game_system/Warhammer4.rb +326 -0
  260. data/lib/bcdice/game_system/WitchQuest.rb +1 -1
  261. data/lib/bcdice/game_system/WorldOfDarkness.rb +1 -1
  262. data/lib/bcdice/game_system/YankeeYogSothoth.rb +15 -15
  263. data/lib/bcdice/game_system/YearZeroEngine.rb +1 -1
  264. data/lib/bcdice/game_system/Yggdrasill.rb +605 -0
  265. data/lib/bcdice/game_system/ZettaiReido.rb +2 -2
  266. data/lib/bcdice/game_system/cthulhu7th/full_auto.rb +294 -0
  267. data/lib/bcdice/game_system/cthulhu7th/rollable.rb +41 -0
  268. data/lib/bcdice/game_system/filled_with/cook_tables.rb +119 -0
  269. data/lib/bcdice/game_system/filled_with/lot_tables.rb +155 -0
  270. data/lib/bcdice/game_system/meikyu_kingdom/item_table.rb +2 -0
  271. data/lib/bcdice/game_system/meikyu_kingdom/kingdom_name_table.rb +2 -0
  272. data/lib/bcdice/game_system/meikyu_kingdom/landscape_table.rb +2 -0
  273. data/lib/bcdice/game_system/meikyu_kingdom/name_tables.rb +2 -0
  274. data/lib/bcdice/game_system/meikyu_kingdom/placename_table.rb +2 -0
  275. data/lib/bcdice/game_system/meikyu_kingdom/tables.rb +2 -0
  276. data/lib/bcdice/game_system/meikyu_kingdom/word_table.rb +2 -0
  277. data/lib/bcdice/game_system/meikyu_kingdom_basic/item_table.rb +2 -0
  278. data/lib/bcdice/game_system/meikyu_kingdom_basic/kingdom_table.rb +2 -0
  279. data/lib/bcdice/game_system/meikyu_kingdom_basic/name_table.rb +2 -0
  280. data/lib/bcdice/game_system/meikyu_kingdom_basic/table.rb +2 -0
  281. data/lib/bcdice/game_system/meikyu_kingdom_basic/word_table.rb +2 -0
  282. data/lib/bcdice/game_system/one_way_heroics/dungeon_table.rb +2 -0
  283. data/lib/bcdice/game_system/one_way_heroics/random_event_table.rb +2 -0
  284. data/lib/bcdice/game_system/one_way_heroics/tables.rb +2 -0
  285. data/lib/bcdice/game_system/satasupe/tables.rb +723 -0
  286. data/lib/bcdice/game_system/sword_world/rating_lexer.rb +47 -0
  287. data/lib/bcdice/game_system/sword_world/rating_parsed.rb +99 -0
  288. data/lib/bcdice/game_system/sword_world/rating_parser.rb +457 -0
  289. data/lib/bcdice/game_system/sword_world/transcendent_test.rb +104 -0
  290. data/lib/bcdice/loader.rb +17 -12
  291. data/lib/bcdice/normalize.rb +3 -1
  292. data/lib/bcdice/preprocessor.rb +23 -44
  293. data/lib/bcdice/randomizer.rb +14 -0
  294. data/lib/bcdice/repl.rb +4 -2
  295. data/lib/bcdice/result.rb +87 -0
  296. data/lib/bcdice/translate.rb +13 -0
  297. data/lib/bcdice/user_defined_dice_table.rb +28 -15
  298. data/lib/bcdice/version.rb +3 -1
  299. metadata +101 -24
  300. data/.editorconfig +0 -21
  301. data/.github/.codecov.yaml +0 -10
  302. data/.github/workflows/coverage.yaml +0 -21
  303. data/.github/workflows/lint.yaml +0 -13
  304. data/.github/workflows/test.yml +0 -20
  305. data/.gitignore +0 -14
  306. data/.rubocop.yml +0 -96
  307. data/.rubocop_todo.yml +0 -113
  308. data/Gemfile +0 -11
  309. data/ROADMAP.md +0 -30
  310. data/Rakefile +0 -118
  311. data/bcdice.gemspec +0 -27
  312. data/bin/repl.rb +0 -21
  313. data/docs/README.txt +0 -2028
  314. data/docs/dicebot_sort_key.md +0 -72
  315. data/docs/how_to_make_dicebot.md +0 -453
  316. data/lib/bcdice/command_parser.rb +0 -242
@@ -0,0 +1,57 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "strscan"
4
+ require "bcdice/normalize"
5
+
6
+ module BCDice
7
+ module Command
8
+ class Lexer
9
+ SYMBOLS = {
10
+ "+" => :PLUS,
11
+ "-" => :MINUS,
12
+ "*" => :ASTERISK,
13
+ "/" => :SLASH,
14
+ "(" => :PARENL,
15
+ ")" => :PARENR,
16
+ "?" => :QUESTION,
17
+ "@" => :AT,
18
+ "#" => :SHARP,
19
+ "$" => :DOLLAR,
20
+ }.freeze
21
+
22
+ def initialize(source, notations)
23
+ # sourceが空文字だとString#splitが空になる
24
+ source = source&.split(" ", 2)&.first || ""
25
+ @scanner = StringScanner.new(source)
26
+ @notations = notations.map do |n|
27
+ n.is_a?(String) ? Regexp.new(n) : n
28
+ end
29
+ end
30
+
31
+ def next_token
32
+ return [false, "$"] if @scanner.eos?
33
+
34
+ @notations.each do |n|
35
+ token = @scanner.scan(n)
36
+ return [:NOTATION, token] if token
37
+ end
38
+
39
+ if (number = @scanner.scan(/\d+/))
40
+ [:NUMBER, number.to_i]
41
+ elsif (cmp_op = @scanner.scan(/[<>!=]+/))
42
+ cmp_op = Normalize.comparison_operator(cmp_op)
43
+ type = cmp_op ? :CMP_OP : :ILLEGAL
44
+ [type, cmp_op]
45
+ else
46
+ char = @scanner.getch.upcase
47
+ type = SYMBOLS[char] || char.to_sym
48
+ [type, char]
49
+ end
50
+ end
51
+
52
+ def source
53
+ @scanner.string
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,65 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BCDice
4
+ module Command
5
+ class Parsed
6
+ # @return [String]
7
+ attr_accessor :command
8
+
9
+ # @return [Integer, nil]
10
+ attr_accessor :critical
11
+
12
+ # @return [Integer, nil]
13
+ attr_accessor :fumble
14
+
15
+ # @return [Integer, nil]
16
+ attr_accessor :dollar
17
+
18
+ # @return [Integer]
19
+ attr_accessor :modify_number
20
+
21
+ # @return [Symbol, nil]
22
+ attr_accessor :cmp_op
23
+
24
+ # @return [Integer, nil]
25
+ attr_accessor :target_number
26
+
27
+ # @param value [Boolean]
28
+ # @return [Boolean]
29
+ attr_writer :question_target
30
+
31
+ def initialize
32
+ @critical = nil
33
+ @fumble = nil
34
+ @dollar = nil
35
+ @cmp_op = nil
36
+ @target_number = nil
37
+ @question_target = false
38
+ end
39
+
40
+ # @return [Boolean]
41
+ def question_target?
42
+ @question_target
43
+ end
44
+
45
+ # @param suffix_position [Symbol] クリティカルなどの表示位置
46
+ # @return [String]
47
+ def to_s(suffix_position = :after_command)
48
+ c = @critical ? "@#{@critical}" : nil
49
+ f = @fumble ? "##{@fumble}" : nil
50
+ d = @dollar ? "$#{@dollar}" : nil
51
+ m = Format.modifier(@modify_number)
52
+ target = @question_target ? "?" : @target_number
53
+
54
+ case suffix_position
55
+ when :after_command
56
+ [@command, c, f, d, m, @cmp_op, target].join()
57
+ when :after_modify_number
58
+ [@command, m, c, f, d, @cmp_op, target].join()
59
+ when :after_target_number
60
+ [@command, m, @cmp_op, target, c, f, d].join()
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,489 @@
1
+ #
2
+ # DO NOT MODIFY!!!!
3
+ # This file is automatically generated by Racc 1.5.1
4
+ # from Racc grammar file "".
5
+ #
6
+
7
+ require 'racc/parser.rb'
8
+
9
+
10
+ require "bcdice/arithmetic/node"
11
+ require "bcdice/command/lexer"
12
+ require "bcdice/command/parsed"
13
+
14
+ # よくある形式のコマンドのパースを補助するクラス
15
+ #
16
+ # @example Literal by String
17
+ # parser = Command::Parser.new("MC", round_type: BCDice::RoundType::FLOOR)
18
+ # .enable_critical
19
+ # parsed = parser.parse("MC+2*3@30<=10/2-3") #=> <Command::Parsed>
20
+ #
21
+ # parsed.command #=> "MC"
22
+ # parsed.modify_number #=> 6
23
+ # parsed.critical #=> 30
24
+ # parsed.cmp_op #=> #>=
25
+ # parsed.target_number #=> 2
26
+ #
27
+ # @example Literal by Regexp
28
+ # parser = Command::Parser.new(/RE\d+/)
29
+ # parsed = parser.parse("RE44+20") #=> <Command::Parsed>
30
+ #
31
+ # parsed.command #=> "RE44"
32
+ # parsed.modify_number #=> 20
33
+ class BCDice::Command::Parser < Racc::Parser; end
34
+
35
+ module BCDice
36
+ module Command
37
+ class Parser < Racc::Parser
38
+
39
+
40
+ def initialize(*notations, round_type:)
41
+ super()
42
+ @notations = notations
43
+ @round_type = round_type
44
+ @modifier = true
45
+ @critical = false
46
+ @fumble = false
47
+ @dollar = false
48
+ @allowed_cmp_op = [nil, :>=, :>, :<=, :<, :==, :!=]
49
+ @question_target = false
50
+ end
51
+
52
+ # 修正値は受け付けないようにする
53
+ # @return [BCDice::Command::Parser]
54
+ def disable_modifier
55
+ @modifier = false
56
+ self
57
+ end
58
+
59
+ # +@+によるクリティカル値の指定を許可する
60
+ # @return [BCDice::Command::Parser]
61
+ def enable_critical
62
+ @critical = true
63
+ self
64
+ end
65
+
66
+ # +#+によるファンブル値の指定を許可する
67
+ # @return [BCDice::Command::Parser]
68
+ def enable_fumble
69
+ @fumble = true
70
+ self
71
+ end
72
+
73
+ # +$+による値の指定を許可する
74
+ # @return [BCDice::Command::Parser]
75
+ def enable_dollar
76
+ @dollar = true
77
+ self
78
+ end
79
+
80
+ # 使用できる比較演算子を制限する。
81
+ # 目標値未入力を許可する場合には+nil+を指定する。
82
+ # @param ops [Array<nil, Symbol>] 許可する比較演算子の一覧
83
+ # @return [BCDice::Command::Parser]
84
+ def restrict_cmp_op_to(*ops)
85
+ @allowed_cmp_op = ops
86
+ self
87
+ end
88
+
89
+ # 目標値"?"の指定を許可する
90
+ # @return [BCDice::Command::Parser]
91
+ def enable_question_target
92
+ @question_target = true
93
+ self
94
+ end
95
+
96
+ # @param source [String]
97
+ # @return [BCDice::Command::Parsed, nil]
98
+ def parse(source)
99
+ @lexer = Lexer.new(source, @notations)
100
+ do_parse()
101
+ rescue ParseError, ZeroDivisionError
102
+ nil
103
+ end
104
+
105
+ private
106
+
107
+ def parsed(notation, option, modifier, target)
108
+ Parsed.new.tap do |p|
109
+ p.command = notation
110
+ p.critical = option[:critical]&.eval(@round_type)
111
+ p.fumble = option[:fumble]&.eval(@round_type)
112
+ p.dollar = option[:dollar]&.eval(@round_type)
113
+ p.modify_number = modifier.eval(@round_type)
114
+ p.cmp_op = target[:cmp_op]
115
+ if target[:target] == "?"
116
+ p.question_target = true
117
+ p.target_number = 0
118
+ else
119
+ p.question_target = false
120
+ p.target_number = target[:target]&.eval(@round_type)
121
+ end
122
+ end
123
+ end
124
+
125
+ def next_token
126
+ @lexer.next_token
127
+ end
128
+ ##### State transition tables begin ###
129
+
130
+ racc_action_table = [
131
+ 24, 6, 7, 16, 17, 20, 21, 16, 17, 23,
132
+ 6, 7, 14, 36, 37, 31, 11, 12, 13, 14,
133
+ 24, 2, 24, 36, 37, 20, 21, 20, 21, 23,
134
+ 24, 23, 24, 41, 42, 20, 21, 20, 21, 23,
135
+ 24, 23, 24, 36, 37, 20, 21, 20, 21, 23,
136
+ 24, 23, 24, 36, 37, 20, 21, 20, 21, 23,
137
+ 24, 23, 24, 36, 37, 20, 21, 20, 21, 23,
138
+ 24, 23, 24, 36, 37, 20, 21, 20, 21, 23,
139
+ 24, 23, 24, 36, 37, 20, 21, 20, 21, 23,
140
+ 3, 23, 41, 42, 8, nil, nil, 45, 11, 12,
141
+ 13, 14, 51, 49, 50, 52 ]
142
+
143
+ racc_action_check = [
144
+ 14, 2, 2, 9, 9, 14, 14, 5, 5, 14,
145
+ 4, 4, 9, 18, 18, 14, 4, 4, 4, 4,
146
+ 6, 0, 7, 25, 25, 6, 6, 7, 7, 6,
147
+ 11, 7, 12, 30, 30, 11, 11, 12, 12, 11,
148
+ 13, 12, 16, 32, 32, 13, 13, 16, 16, 13,
149
+ 17, 16, 20, 34, 34, 17, 17, 20, 20, 17,
150
+ 21, 20, 23, 35, 35, 21, 21, 23, 23, 21,
151
+ 36, 23, 37, 46, 46, 36, 36, 37, 37, 36,
152
+ 41, 37, 42, 47, 47, 41, 41, 42, 42, 41,
153
+ 1, 42, 40, 40, 3, nil, nil, 40, 15, 15,
154
+ 15, 15, 44, 44, 44, 44 ]
155
+
156
+ racc_action_pointer = [
157
+ 3, 90, -6, 94, 3, 0, 18, 20, nil, -4,
158
+ nil, 28, 30, 38, -2, 85, 40, 48, 4, nil,
159
+ 50, 58, nil, 60, nil, 14, nil, nil, nil, nil,
160
+ 26, nil, 34, nil, 44, 54, 68, 70, nil, nil,
161
+ 85, 78, 80, nil, 99, nil, 64, 74, nil, nil,
162
+ nil, nil, nil ]
163
+
164
+ racc_action_default = [
165
+ -31, -31, -4, -31, -12, -4, -31, -31, 53, -12,
166
+ -3, -31, -31, -31, -31, -12, -31, -31, -8, -20,
167
+ -31, -31, -28, -31, -30, -9, -1, -5, -6, -7,
168
+ -13, -14, -17, -2, -10, -11, -31, -31, -26, -27,
169
+ -31, -31, -31, -18, -21, -29, -15, -16, -19, -22,
170
+ -23, -24, -25 ]
171
+
172
+ racc_goto_table = [
173
+ 18, 25, 1, 27, 28, 29, 30, 48, nil, 10,
174
+ 34, 35, 38, 39, 26, 40, 4, nil, nil, 15,
175
+ 33, 5, nil, 9, nil, nil, nil, nil, 43, 44,
176
+ nil, nil, nil, nil, nil, 46, 47 ]
177
+
178
+ racc_goto_check = [
179
+ 6, 6, 1, 5, 5, 5, 7, 8, nil, 4,
180
+ 6, 6, 5, 5, 4, 7, 2, nil, nil, 2,
181
+ 4, 3, nil, 3, nil, nil, nil, nil, 5, 5,
182
+ nil, nil, nil, nil, nil, 6, 6 ]
183
+
184
+ racc_goto_pointer = [
185
+ nil, 2, 14, 19, 5, -8, -6, -8, -37, nil ]
186
+
187
+ racc_goto_default = [
188
+ nil, nil, nil, nil, nil, 19, 32, nil, nil, 22 ]
189
+
190
+ racc_reduce_table = [
191
+ 0, 0, :racc_error,
192
+ 4, 20, :_reduce_1,
193
+ 4, 20, :_reduce_2,
194
+ 3, 20, :_reduce_3,
195
+ 0, 21, :_reduce_4,
196
+ 3, 21, :_reduce_5,
197
+ 3, 21, :_reduce_6,
198
+ 3, 21, :_reduce_7,
199
+ 2, 22, :_reduce_8,
200
+ 2, 22, :_reduce_9,
201
+ 3, 22, :_reduce_10,
202
+ 3, 22, :_reduce_11,
203
+ 0, 23, :_reduce_12,
204
+ 2, 23, :_reduce_13,
205
+ 2, 23, :_reduce_14,
206
+ 3, 26, :_reduce_15,
207
+ 3, 26, :_reduce_16,
208
+ 1, 26, :_reduce_none,
209
+ 3, 25, :_reduce_18,
210
+ 4, 25, :_reduce_19,
211
+ 1, 25, :_reduce_none,
212
+ 0, 27, :_reduce_21,
213
+ 1, 27, :_reduce_22,
214
+ 1, 27, :_reduce_23,
215
+ 1, 27, :_reduce_24,
216
+ 1, 27, :_reduce_25,
217
+ 2, 24, :_reduce_26,
218
+ 2, 24, :_reduce_27,
219
+ 1, 24, :_reduce_none,
220
+ 3, 28, :_reduce_29,
221
+ 1, 28, :_reduce_30 ]
222
+
223
+ racc_reduce_n = 31
224
+
225
+ racc_shift_n = 53
226
+
227
+ racc_token_table = {
228
+ false => 0,
229
+ :error => 1,
230
+ :NUMBER => 2,
231
+ :R => 3,
232
+ :U => 4,
233
+ :C => 5,
234
+ :F => 6,
235
+ :PLUS => 7,
236
+ :MINUS => 8,
237
+ :ASTERISK => 9,
238
+ :SLASH => 10,
239
+ :PARENL => 11,
240
+ :PARENR => 12,
241
+ :AT => 13,
242
+ :SHARP => 14,
243
+ :DOLLAR => 15,
244
+ :CMP_OP => 16,
245
+ :QUESTION => 17,
246
+ :NOTATION => 18 }
247
+
248
+ racc_nt_base = 19
249
+
250
+ racc_use_result_var = true
251
+
252
+ Racc_arg = [
253
+ racc_action_table,
254
+ racc_action_check,
255
+ racc_action_default,
256
+ racc_action_pointer,
257
+ racc_goto_table,
258
+ racc_goto_check,
259
+ racc_goto_default,
260
+ racc_goto_pointer,
261
+ racc_nt_base,
262
+ racc_reduce_table,
263
+ racc_token_table,
264
+ racc_shift_n,
265
+ racc_reduce_n,
266
+ racc_use_result_var ]
267
+
268
+ Racc_token_to_s_table = [
269
+ "$end",
270
+ "error",
271
+ "NUMBER",
272
+ "R",
273
+ "U",
274
+ "C",
275
+ "F",
276
+ "PLUS",
277
+ "MINUS",
278
+ "ASTERISK",
279
+ "SLASH",
280
+ "PARENL",
281
+ "PARENR",
282
+ "AT",
283
+ "SHARP",
284
+ "DOLLAR",
285
+ "CMP_OP",
286
+ "QUESTION",
287
+ "NOTATION",
288
+ "$start",
289
+ "expr",
290
+ "option",
291
+ "modifier",
292
+ "target",
293
+ "unary",
294
+ "mul",
295
+ "add",
296
+ "round_type",
297
+ "term" ]
298
+
299
+ Racc_debug_parser = false
300
+
301
+ ##### State transition tables end #####
302
+
303
+ # reduce 0 omitted
304
+
305
+ def _reduce_1(val, _values, result)
306
+ raise ParseError unless @modifier
307
+ notation, option, modifier, target = val
308
+ result = parsed(notation, option, modifier, target)
309
+
310
+ result
311
+ end
312
+
313
+ def _reduce_2(val, _values, result)
314
+ raise ParseError unless @modifier
315
+ notation, modifier, option, target = val
316
+ result = parsed(notation, option, modifier, target)
317
+
318
+ result
319
+ end
320
+
321
+ def _reduce_3(val, _values, result)
322
+ notation, option, target = val
323
+ result = parsed(notation, option, Arithmetic::Node::Number.new(0), target)
324
+
325
+ result
326
+ end
327
+
328
+ def _reduce_4(val, _values, result)
329
+ result = {}
330
+
331
+ result
332
+ end
333
+
334
+ def _reduce_5(val, _values, result)
335
+ option, _, term = val
336
+ raise ParseError unless @critical && option[:critical].nil?
337
+
338
+ option[:critical] = term
339
+ result = option
340
+
341
+ result
342
+ end
343
+
344
+ def _reduce_6(val, _values, result)
345
+ option, _, term = val
346
+ raise ParseError unless @fumble && option[:fumble].nil?
347
+
348
+ option[:fumble] = term
349
+ result = option
350
+
351
+ result
352
+ end
353
+
354
+ def _reduce_7(val, _values, result)
355
+ option, _, term = val
356
+ raise ParseError unless @dollar && option[:dollar].nil?
357
+
358
+ option[:dollar] = term
359
+ result = option
360
+
361
+ result
362
+ end
363
+
364
+ def _reduce_8(val, _values, result)
365
+ result = val[1]
366
+ result
367
+ end
368
+
369
+ def _reduce_9(val, _values, result)
370
+ result = Arithmetic::Node::Negative.new(val[1])
371
+ result
372
+ end
373
+
374
+ def _reduce_10(val, _values, result)
375
+ result = Arithmetic::Node::BinaryOp.new(val[0], :+, val[2])
376
+ result
377
+ end
378
+
379
+ def _reduce_11(val, _values, result)
380
+ result = Arithmetic::Node::BinaryOp.new(val[0], :-, val[2])
381
+ result
382
+ end
383
+
384
+ def _reduce_12(val, _values, result)
385
+ raise ParseError unless @allowed_cmp_op.include?(nil)
386
+ result = {}
387
+
388
+ result
389
+ end
390
+
391
+ def _reduce_13(val, _values, result)
392
+ cmp_op, target = val
393
+ raise ParseError unless @allowed_cmp_op.include?(cmp_op)
394
+
395
+ result = {cmp_op: cmp_op, target: target}
396
+
397
+ result
398
+ end
399
+
400
+ def _reduce_14(val, _values, result)
401
+ cmp_op = val[0]
402
+ raise ParseError unless @question_target
403
+ raise ParseError unless @allowed_cmp_op.include?(cmp_op)
404
+
405
+ result = {cmp_op: cmp_op, target: "?"}
406
+
407
+ result
408
+ end
409
+
410
+ def _reduce_15(val, _values, result)
411
+ result = Arithmetic::Node::BinaryOp.new(val[0], :+, val[2])
412
+ result
413
+ end
414
+
415
+ def _reduce_16(val, _values, result)
416
+ result = Arithmetic::Node::BinaryOp.new(val[0], :-, val[2])
417
+ result
418
+ end
419
+
420
+ # reduce 17 omitted
421
+
422
+ def _reduce_18(val, _values, result)
423
+ result = Arithmetic::Node::BinaryOp.new(val[0], :*, val[2])
424
+ result
425
+ end
426
+
427
+ def _reduce_19(val, _values, result)
428
+ divied_class = val[3]
429
+ result = divied_class.new(val[0], val[2])
430
+
431
+ result
432
+ end
433
+
434
+ # reduce 20 omitted
435
+
436
+ def _reduce_21(val, _values, result)
437
+ result = Arithmetic::Node::DivideWithGameSystemDefault
438
+ result
439
+ end
440
+
441
+ def _reduce_22(val, _values, result)
442
+ result = Arithmetic::Node::DivideWithCeil
443
+ result
444
+ end
445
+
446
+ def _reduce_23(val, _values, result)
447
+ result = Arithmetic::Node::DivideWithCeil
448
+ result
449
+ end
450
+
451
+ def _reduce_24(val, _values, result)
452
+ result = Arithmetic::Node::DivideWithRound
453
+ result
454
+ end
455
+
456
+ def _reduce_25(val, _values, result)
457
+ result = Arithmetic::Node::DivideWithFloor
458
+ result
459
+ end
460
+
461
+ def _reduce_26(val, _values, result)
462
+ result = val[1]
463
+ result
464
+ end
465
+
466
+ def _reduce_27(val, _values, result)
467
+ result = Arithmetic::Node::Negative.new(val[1])
468
+ result
469
+ end
470
+
471
+ # reduce 28 omitted
472
+
473
+ def _reduce_29(val, _values, result)
474
+ result = val[1]
475
+ result
476
+ end
477
+
478
+ def _reduce_30(val, _values, result)
479
+ result = Arithmetic::Node::Number.new(val[0])
480
+ result
481
+ end
482
+
483
+ def _reduce_none(val, _values, result)
484
+ val[0]
485
+ end
486
+
487
+ end # class Parser
488
+ end # module Command
489
+ end # module BCDice