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

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 (151) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +6 -0
  3. data/README.md +1 -0
  4. data/i18n/KillDeathBusiness/ja_jp.yml +4 -4
  5. data/i18n/KillDeathBusiness/ko_kr.yml +5 -4
  6. data/i18n/MagicaLogia/ko_kr.yml +564 -0
  7. data/i18n/MonotoneMuseum/ja_jp.yml +37 -1
  8. data/i18n/StratoShout/ja_jp.yml +4 -4
  9. data/i18n/StratoShout/ko_kr.yml +4 -4
  10. data/lib/bcdice.rb +2 -1
  11. data/lib/bcdice/arithmetic.rb +22 -0
  12. data/lib/bcdice/arithmetic/node.rb +112 -43
  13. data/lib/bcdice/arithmetic/parser.rb +240 -0
  14. data/lib/bcdice/arithmetic_evaluator.rb +5 -156
  15. data/lib/bcdice/base.rb +8 -1
  16. data/lib/bcdice/command/lexer.rb +57 -0
  17. data/lib/bcdice/command/parsed.rb +65 -0
  18. data/lib/bcdice/command/parser.rb +489 -0
  19. data/lib/bcdice/common_command/add_dice.rb +1 -1
  20. data/lib/bcdice/common_command/add_dice/node.rb +142 -69
  21. data/lib/bcdice/common_command/add_dice/parser.rb +100 -83
  22. data/lib/bcdice/common_command/barabara_dice/node.rb +7 -1
  23. data/lib/bcdice/common_command/barabara_dice/result.rb +22 -0
  24. data/lib/bcdice/common_command/calc/node.rb +10 -1
  25. data/lib/bcdice/common_command/calc/parser.rb +1 -1
  26. data/lib/bcdice/common_command/d66_dice.rb +3 -1
  27. data/lib/bcdice/common_command/lexer.rb +2 -1
  28. data/lib/bcdice/common_command/upper_dice/parser.rb +118 -97
  29. data/lib/bcdice/common_command/version.rb +1 -1
  30. data/lib/bcdice/deprecated/checker.rb +6 -6
  31. data/lib/bcdice/dice_table.rb +1 -0
  32. data/lib/bcdice/dice_table/d66_parity_table.rb +34 -0
  33. data/lib/bcdice/game_system.rb +3 -0
  34. data/lib/bcdice/game_system/AceKillerGene.rb +1 -1
  35. data/lib/bcdice/game_system/AlchemiaStruggle.rb +312 -0
  36. data/lib/bcdice/game_system/Alshard.rb +0 -1
  37. data/lib/bcdice/game_system/Amadeus.rb +1 -1
  38. data/lib/bcdice/game_system/AnimaAnimus.rb +1 -5
  39. data/lib/bcdice/game_system/BadLife.rb +1 -1
  40. data/lib/bcdice/game_system/BeastBindTrinity.rb +1 -10
  41. data/lib/bcdice/game_system/BeginningIdol.rb +4 -4
  42. data/lib/bcdice/game_system/BeginningIdol_Korean.rb +4 -4
  43. data/lib/bcdice/game_system/BladeOfArcana.rb +4 -4
  44. data/lib/bcdice/game_system/BlindMythos.rb +12 -9
  45. data/lib/bcdice/game_system/BloodCrusade.rb +12 -38
  46. data/lib/bcdice/game_system/BloodMoon.rb +2 -2
  47. data/lib/bcdice/game_system/CardRanker.rb +23 -63
  48. data/lib/bcdice/game_system/ChaosFlare.rb +3 -3
  49. data/lib/bcdice/game_system/CodeLayerd.rb +1 -1
  50. data/lib/bcdice/game_system/ColossalHunter.rb +2 -2
  51. data/lib/bcdice/game_system/Cthulhu7th.rb +2 -2
  52. data/lib/bcdice/game_system/CthulhuTech.rb +0 -1
  53. data/lib/bcdice/game_system/DarkBlaze.rb +4 -4
  54. data/lib/bcdice/game_system/DeadlineHeroes.rb +1 -1
  55. data/lib/bcdice/game_system/DoubleCross.rb +60 -93
  56. data/lib/bcdice/game_system/EmbryoMachine.rb +5 -5
  57. data/lib/bcdice/game_system/EtrianOdysseySRS.rb +0 -1
  58. data/lib/bcdice/game_system/FilledWith.rb +3 -3
  59. data/lib/bcdice/game_system/FullMetalPanic.rb +0 -1
  60. data/lib/bcdice/game_system/GURPS.rb +1 -1
  61. data/lib/bcdice/game_system/Garako.rb +3 -2
  62. data/lib/bcdice/game_system/GardenOrder.rb +1 -1
  63. data/lib/bcdice/game_system/GehennaAn.rb +3 -3
  64. data/lib/bcdice/game_system/Gundog.rb +1 -1
  65. data/lib/bcdice/game_system/GundogRevised.rb +3 -3
  66. data/lib/bcdice/game_system/GundogZero.rb +2 -2
  67. data/lib/bcdice/game_system/GurpsFW.rb +2 -5
  68. data/lib/bcdice/game_system/HatsuneMiku.rb +1 -1
  69. data/lib/bcdice/game_system/HuntersMoon.rb +17 -110
  70. data/lib/bcdice/game_system/JuinKansen.rb +251 -0
  71. data/lib/bcdice/game_system/KanColle.rb +17 -166
  72. data/lib/bcdice/game_system/KillDeathBusiness.rb +35 -44
  73. data/lib/bcdice/game_system/KillDeathBusiness_Korean.rb +2 -1
  74. data/lib/bcdice/game_system/LogHorizon.rb +8 -8
  75. data/lib/bcdice/game_system/LostRoyal.rb +1 -3
  76. data/lib/bcdice/game_system/MagicaLogia.rb +3 -3
  77. data/lib/bcdice/game_system/MagicaLogia_Korean.rb +66 -0
  78. data/lib/bcdice/game_system/MeikyuDays.rb +1 -1
  79. data/lib/bcdice/game_system/MeikyuKingdom.rb +1 -1
  80. data/lib/bcdice/game_system/MeikyuKingdomBasic.rb +1 -1
  81. data/lib/bcdice/game_system/MetalHeadExtream.rb +4 -4
  82. data/lib/bcdice/game_system/MetallicGuardian.rb +0 -1
  83. data/lib/bcdice/game_system/MonotoneMuseum.rb +3 -2
  84. data/lib/bcdice/game_system/MonotoneMuseum_Korean.rb +1 -1
  85. data/lib/bcdice/game_system/NSSQ.rb +2 -2
  86. data/lib/bcdice/game_system/Nechronica.rb +3 -3
  87. data/lib/bcdice/game_system/NightWizard.rb +1 -1
  88. data/lib/bcdice/game_system/NightmareHunterDeep.rb +3 -4
  89. data/lib/bcdice/game_system/NinjaSlayer.rb +26 -28
  90. data/lib/bcdice/game_system/OracleEngine.rb +13 -17
  91. data/lib/bcdice/game_system/Paradiso.rb +2 -2
  92. data/lib/bcdice/game_system/PhantasmAdventure.rb +0 -4
  93. data/lib/bcdice/game_system/Raisondetre.rb +1 -1
  94. data/lib/bcdice/game_system/RecordOfLodossWar.rb +2 -3
  95. data/lib/bcdice/game_system/RokumonSekai2.rb +2 -2
  96. data/lib/bcdice/game_system/RuinBreakers.rb +1 -1
  97. data/lib/bcdice/game_system/Ryutama.rb +1 -1
  98. data/lib/bcdice/game_system/SRS.rb +0 -5
  99. data/lib/bcdice/game_system/SamsaraBallad.rb +4 -3
  100. data/lib/bcdice/game_system/Satasupe.rb +22 -14
  101. data/lib/bcdice/game_system/ScreamHighSchool.rb +2 -2
  102. data/lib/bcdice/game_system/ShinkuuGakuen.rb +1 -1
  103. data/lib/bcdice/game_system/ShinobiGami.rb +75 -39
  104. data/lib/bcdice/game_system/StellarKnights.rb +1 -3
  105. data/lib/bcdice/game_system/SterileLife.rb +1 -1
  106. data/lib/bcdice/game_system/StrangerOfSwordCity.rb +1 -1
  107. data/lib/bcdice/game_system/StratoShout.rb +10 -36
  108. data/lib/bcdice/game_system/StratoShout_Korean.rb +2 -1
  109. data/lib/bcdice/game_system/SwordWorld.rb +5 -5
  110. data/lib/bcdice/game_system/SwordWorld2_5.rb +1 -1
  111. data/lib/bcdice/game_system/TherapieSein.rb +2 -2
  112. data/lib/bcdice/game_system/TokumeiTenkousei.rb +2 -2
  113. data/lib/bcdice/game_system/Torg.rb +1 -1
  114. data/lib/bcdice/game_system/TorgEternity.rb +4 -7
  115. data/lib/bcdice/game_system/TrinitySeven.rb +2 -2
  116. data/lib/bcdice/game_system/TunnelsAndTrolls.rb +6 -6
  117. data/lib/bcdice/game_system/TwilightGunsmoke.rb +1 -1
  118. data/lib/bcdice/game_system/Utakaze.rb +1 -1
  119. data/lib/bcdice/game_system/Warhammer.rb +6 -6
  120. data/lib/bcdice/game_system/Warhammer4.rb +9 -12
  121. data/lib/bcdice/game_system/ZettaiReido.rb +1 -1
  122. data/lib/bcdice/normalize.rb +1 -1
  123. data/lib/bcdice/preprocessor.rb +12 -8
  124. data/lib/bcdice/randomizer.rb +12 -0
  125. data/lib/bcdice/repl.rb +1 -1
  126. data/lib/bcdice/result.rb +2 -0
  127. data/lib/bcdice/user_defined_dice_table.rb +26 -15
  128. data/lib/bcdice/version.rb +1 -1
  129. metadata +14 -25
  130. data/.editorconfig +0 -21
  131. data/.github/.codecov.yaml +0 -10
  132. data/.github/workflows/coverage.yaml +0 -21
  133. data/.github/workflows/lint.yaml +0 -13
  134. data/.github/workflows/test.yml +0 -20
  135. data/.gitignore +0 -14
  136. data/.rubocop.yml +0 -108
  137. data/.rubocop_todo.yml +0 -114
  138. data/Gemfile +0 -14
  139. data/ROADMAP.md +0 -30
  140. data/Rakefile +0 -152
  141. data/bcdice.gemspec +0 -29
  142. data/bin/repl.rb +0 -21
  143. data/docs/README.txt +0 -2028
  144. data/docs/dicebot_sort_key.md +0 -72
  145. data/docs/how_to_make_dicebot.md +0 -453
  146. data/lib/bcdice/command_parser.rb +0 -242
  147. data/lib/bcdice/common_command/add_dice/parser.y +0 -153
  148. data/lib/bcdice/common_command/barabara_dice/parser.y +0 -107
  149. data/lib/bcdice/common_command/calc/parser.y +0 -79
  150. data/lib/bcdice/common_command/reroll_dice/parser.y +0 -158
  151. data/lib/bcdice/common_command/upper_dice/parser.y +0 -143
@@ -522,4 +522,40 @@ ja_jp:
522
522
  - |-
523
523
  【炎上】
524
524
  館が炎上をはじめる。ここに留まっていれば、問答無用で死ぬことになるだろう。
525
-
525
+ OT3:
526
+ name: 兆候表ver3.0
527
+ type: 2D6
528
+ items:
529
+ - |-
530
+ 【暴走衝動】
531
+ 心の奥から抗いがたい衝動が湧き上がってくる。目の前の生命を引き裂きたい――あなたの意に反して、その腕が振り上げられた。 至近距離にいるキャラクターすべてに、即座に〈縫〉2D6点のダメージを与える。 戦闘中でない場合、どこまでを至近距離とするかはGMが判断すること。ダメージを与える対象がいない場合、この演目中あなたの行動値を+1する。
532
+ - |-
533
+ 【ひび割れ】
534
+ 激痛が走り、あなたの肌が音を立ててひび割れた。あなたは [2D6+演者レベル]の【HP】を失う。
535
+ - |-
536
+ 【漆黒の羽】
537
+ あなたの背に怖気立つ痒みが走り、漆黒の羽が芽吹きはじめた。この演目中、あなたはマイナーアクションで剥離値を1点上昇させることで飛行状態となる(解除にはマイナーアクションを使用)。
538
+ - |-
539
+ 【信念の喪失】
540
+ あなたが何者であったのか、暖かな過去が、辛い記憶が虚無の彼方へと消えていく。あなたは[出自]を喪失する。特徴は失われない。
541
+ - |-
542
+ 【色褪せる体躯】
543
+ あなたの髪が目が、色あせ虚ろに染まっていく。その身が虚無へと近づいている証だ……。この演目中、あなたの【縫製】判定の達成値に+1する。
544
+ - |-
545
+ 【現在の喪失】
546
+ あなたの心からかけがえのない“誰か”の存在が、あるいはその人物に抱いていた大切な想いが消えていく。あなたはパートナーをひとつ喪失する。
547
+ - |-
548
+ 【影なし】
549
+ あなたの足元から影が喪われていく。透明化だ……。誰かに気づかれたら最後、異形と糾弾されるだろう。この演目中、あなたの【社会】判定の達成値に-1する。
550
+ - |-
551
+ 【心喰らい】
552
+ あなたの心にぽっかりと空虚が開いた。失われたのは感情か信念か……いずれにせよ、消え去ったそれが何であったかを思い出すことはできないだろう。あなたは2D6点の【MP】を失う。
553
+ - |-
554
+ 【獣のごとき】
555
+ 漆黒の獣毛や曇白の鱗があなたの手足を浸食していく。周囲に隠し通さねば、化け物と追われることは避けられないだろう。この演目中、あなたの【社会】判定の達成値に-2する。
556
+ - |-
557
+ 【理由の喪失】
558
+ あなたの人生を変えた大切な記憶が喪われていく。なぜ紡ぎ手となったのか、その理由を失ってなお、あなたはこの場に立ち続けている……。あなたは[境遇]を消失する。特徴は失われない。
559
+ - |-
560
+ 【虚無のしたたり】
561
+ あなたの身体から漆黒の汗や曇白の霧がにじみ出る。この演目中、「対象:自身」を除くあなたが行なう特技の対象すべてに、本来の効果に加え邪毒1を与える。
@@ -2,16 +2,16 @@ ja_jp:
2
2
  StratoShout:
3
3
  critical: スペシャル! (【コンディション】+2)
4
4
  fumble: "ファンブル! (ドラマフェイズ: 【ディスコード】+2 / ライブフェイズ: 【コンディション】-2)"
5
- AT:
6
- name: 特技リスト
7
- table:
5
+ RTT:
6
+ items:
8
7
  - ['主義', ['過去', '恋人', '仲間', '家族', '自分', '今', '理由', '夢', '世界', '幸せ', '未来']]
9
8
  - ['身体', ['頭', '目', '耳', '口', '胸', '心臓', '血', '背中', '手', 'XXX', '足']]
10
9
  - ['モチーフ', ['闇', '武器', '魔法', '獣', '町', '歌', '食べ物', '花', '空', '季節', '光']]
11
10
  - ['エモーション', ['悲しい', '怒り', '不安', '恐怖', '驚き', '高鳴り', '情熱', '確信', '期待', '楽しい', '喜び']]
12
11
  - ['行動', ['泣く', '忘れる', '消す', '壊す', '叫ぶ', '歌う', '踊る', '走る', '鳴らす', '呼ぶ', '笑う']]
13
12
  - ['逆境', ['死', '喪失', '暴力', '孤独', '後悔', '実力', '退屈', '本性', '富', '恋愛', '生']]
14
- skill_class: "(%{name}分野)"
13
+ rtt_format: '特技リスト > [%<category_dice>d,%<row_dice>d] > %<text>s'
14
+ rttn_format: '特技リスト(%<category_name>s分野) > [%<row_dice>d] > %<text>s'
15
15
  table:
16
16
  VOT:
17
17
  name: ボーカルトラブル表(P167)
@@ -2,16 +2,16 @@ ko_kr:
2
2
  StratoShout:
3
3
  critical: 스페셜! (【컨디션】+2)
4
4
  fumble: "펌블! (드라마페이즈: 【디스코드】+2 / 라이브페이즈: 【컨디션】-2)"
5
- AT:
6
- name: 특기 리스트
7
- table:
5
+ RTT:
6
+ items:
8
7
  - ['주의', ['과거', '연인', '동료', '가족', '자신', '지금', '이유', '꿈', '세계', '행복', '미래']]
9
8
  - ['신체', ['머리', '눈', '귀', '입', '가슴', '심장', '피', '등', '손', 'XXX', '발']]
10
9
  - ['모티브', ['어둠', '무기', '짐승', '기계', '거리', '노래', '창', '꽃', '하늘', '계절', '빛']]
11
10
  - ['정서', ['슬픔', '분노', '불안', '공포', '놀라움', '설렘', '정열', '확신', '기대', '즐거움', '기쁨']]
12
11
  - ['행동', ['우는', '잊는', '지우는', '부수는', '외치는', '노래하는', '춤추는', '달리는', '만나는', '부르는', '웃는']]
13
12
  - ['역경', ['죽음', '상실', '폭력', '고독', '후회', '실력', '싫증', '본성', '부', '연애', '삶']]
14
- skill_class: "(%{name}분야)"
13
+ rtt_format: '특기 리스트 > [%<category_dice>d,%<row_dice>d] > %<text>s'
14
+ rttn_format: '특기 리스트(%<category_name>s분야) > [%<row_dice>d] > %<text>s'
15
15
  table:
16
16
  VOT:
17
17
  name: 보컬 트러블표(P167)
@@ -1,5 +1,6 @@
1
1
  require "bcdice/version"
2
- require "bcdice/arithmetic_evaluator.rb"
2
+ require "bcdice/arithmetic"
3
+ require "bcdice/arithmetic_evaluator"
3
4
 
4
5
  require "bcdice/base"
5
6
  require "bcdice/loader"
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bcdice/arithmetic/node"
4
+ require "bcdice/arithmetic/parser"
5
+
6
+ module BCDice
7
+ module Arithmetic
8
+ class << self
9
+ # 四則演算を評価する
10
+ #
11
+ # @param source [String]
12
+ # @param round_type [Symbol]
13
+ # @return [Integer, nil] パースできない式やゼロ除算が発生した場合にはnilを返す
14
+ def eval(source, round_type)
15
+ node = Parser.parse(source)
16
+ node&.eval(round_type)
17
+ rescue ZeroDivisionError
18
+ nil
19
+ end
20
+ end
21
+ end
22
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module BCDice
2
4
  module Arithmetic
3
5
  module Node
@@ -9,34 +11,69 @@ module BCDice
9
11
  end
10
12
 
11
13
  def eval(round_type)
12
- l = lhs.eval(round_type)
13
- r = rhs.eval(round_type)
14
- l.send(op, r)
14
+ l = @lhs.eval(round_type)
15
+ r = @rhs.eval(round_type)
16
+ l.send(@op, r)
15
17
  end
16
18
 
17
- def s_exp
18
- "(#{op} #{lhs.s_exp} #{rhs.s_exp}}"
19
+ # @return [String] メッセージへの出力
20
+ def output
21
+ "#{@lhs.output}#{@op}#{@rhs.output}"
19
22
  end
20
23
 
21
- private
24
+ # @return [String] ノードのS式
25
+ def s_exp
26
+ "(#{op_for_s_exp} #{@lhs.s_exp} #{@rhs.s_exp})"
27
+ end
22
28
 
23
- attr_reader :op, :lhs, :rhs
29
+ # @return [String] S式で使う演算子の表現
30
+ def op_for_s_exp
31
+ @op
32
+ end
24
33
  end
25
34
 
26
35
  # 除算ノードの基底クラス
36
+ #
37
+ # 定数 +ROUNDING_METHOD+ で端数処理方法を示す記号
38
+ # ( +'U'+, +'R'+, +''+ ) を定義すること。
39
+ # また、除算および端数処理を行う +divide_and_round+ メソッドを実装すること。
27
40
  class DivideBase < BinaryOp
41
+ # ノードを初期化する
42
+ # @param [Object] lhs 左のオペランドのノード
43
+ # @param [Object] rhs 右のオペランドのノード
28
44
  def initialize(lhs, rhs)
29
45
  super(lhs, :/, rhs)
30
46
  end
31
47
 
32
48
  def eval(round_type)
33
- l = lhs.eval(round_type)
34
- r = rhs.eval(round_type)
49
+ l = @lhs.eval(round_type)
50
+ r = @rhs.eval(round_type)
35
51
  divide_and_round(l, r, round_type)
36
52
  end
37
53
 
54
+ # メッセージへの出力を返す
55
+ #
56
+ # 通常の結果の末尾に、端数処理方法を示す記号を付加する。
57
+ #
58
+ # @return [String]
59
+ def output
60
+ "#{super}#{rounding_method}"
61
+ end
62
+
38
63
  private
39
64
 
65
+ # 端数処理方法を示す記号を返す
66
+ # @return [String]
67
+ def rounding_method
68
+ self.class::ROUNDING_METHOD
69
+ end
70
+
71
+ # S式で使う演算子の表現を返す
72
+ # @return [String]
73
+ def op_for_s_exp
74
+ "#{@op}#{rounding_method}"
75
+ end
76
+
40
77
  # 除算および端数処理を行う
41
78
  # @param [Integer] _dividend 被除数
42
79
  # @param [Integer] _divisor 除数(0以外)
@@ -47,13 +84,36 @@ module BCDice
47
84
  end
48
85
  end
49
86
 
50
- # 除算(切り上げ)のノード
51
- class DivideWithCeil < DivideBase
87
+ # 除算(端数処理はゲームシステム依存)のノード
88
+ class DivideWithGameSystemDefault < DivideBase
89
+ # 端数処理方法を示す記号
90
+ ROUNDING_METHOD = ""
91
+
52
92
  private
53
93
 
54
- def op
55
- "/C"
94
+ # 除算および端数処理を行う
95
+ # @param [Integer] dividend 被除数
96
+ # @param [Integer] divisor 除数(0以外)
97
+ # @param [Symbol] round_type ゲームシステムの端数処理設定
98
+ # @return [Integer]
99
+ def divide_and_round(dividend, divisor, round_type)
100
+ case round_type
101
+ when RoundType::CEIL
102
+ (dividend.to_f / divisor).ceil
103
+ when RoundType::ROUND
104
+ (dividend.to_f / divisor).round
105
+ else # RoundType::FLOOR
106
+ dividend / divisor
107
+ end
56
108
  end
109
+ end
110
+
111
+ # 除算(切り上げ)のノード
112
+ class DivideWithCeil < DivideBase
113
+ # 端数処理方法を示す記号
114
+ ROUNDING_METHOD = "C"
115
+
116
+ private
57
117
 
58
118
  # 除算および端数処理を行う
59
119
  # @param [Integer] dividend 被除数
@@ -67,11 +127,10 @@ module BCDice
67
127
 
68
128
  # 除算(四捨五入)のノード
69
129
  class DivideWithRound < DivideBase
70
- private
130
+ # 端数処理方法を示す記号
131
+ ROUNDING_METHOD = "R"
71
132
 
72
- def op
73
- "/R"
74
- end
133
+ private
75
134
 
76
135
  # 除算および端数処理を行う
77
136
  # @param [Integer] dividend 被除数
@@ -85,11 +144,10 @@ module BCDice
85
144
 
86
145
  # 除算(切り捨て)のノード
87
146
  class DivideWithFloor < DivideBase
88
- private
147
+ # 端数処理方法を示す記号
148
+ ROUNDING_METHOD = "F"
89
149
 
90
- def op
91
- "/F"
92
- end
150
+ private
93
151
 
94
152
  # 除算および端数処理を行う
95
153
  # @param [Integer] dividend 被除数
@@ -101,27 +159,6 @@ module BCDice
101
159
  end
102
160
  end
103
161
 
104
- # 除算(端数処理はゲームシステム依存)のノード
105
- class DivideWithGameSystemDefault < DivideBase
106
- private
107
-
108
- # 除算および端数処理を行う
109
- # @param [Integer] dividend 被除数
110
- # @param [Integer] divisor 除数(0以外)
111
- # @param [Symbol] round_type ゲームシステムの端数処理設定
112
- # @return [Integer]
113
- def divide_and_round(dividend, divisor, round_type)
114
- case round_type
115
- when RoundType::CEIL
116
- (dividend.to_f / divisor).ceil
117
- when RoundType::ROUND
118
- (dividend.to_f / divisor).round
119
- else # RoundType::FLOOR
120
- dividend / divisor
121
- end
122
- end
123
- end
124
-
125
162
  class Negative
126
163
  def initialize(body)
127
164
  @body = body
@@ -131,11 +168,40 @@ module BCDice
131
168
  -@body.eval(round_type)
132
169
  end
133
170
 
171
+ # @return [String] メッセージへの出力
172
+ def output
173
+ "-#{@body.output}"
174
+ end
175
+
134
176
  def s_exp
135
177
  "(- #{@body.s_exp})"
136
178
  end
137
179
  end
138
180
 
181
+ # カッコで式をまとめるノード
182
+ class Parenthesis
183
+ # @param expr [Object] カッコ内のノード
184
+ def initialize(expr)
185
+ @expr = expr
186
+ end
187
+
188
+ # @param round_type [Symbol] 端数処理方法
189
+ # @return [Integer] 評価結果
190
+ def eval(round_type)
191
+ @expr.eval(round_type)
192
+ end
193
+
194
+ # @return [String] メッセージへの出力
195
+ def output
196
+ "(#{@expr.output})"
197
+ end
198
+
199
+ # @return [String] S式
200
+ def s_exp
201
+ "(Parenthesis #{@expr.s_exp})"
202
+ end
203
+ end
204
+
139
205
  class Number
140
206
  def initialize(value)
141
207
  @value = value
@@ -145,9 +211,12 @@ module BCDice
145
211
  @value
146
212
  end
147
213
 
148
- def s_exp
214
+ # @return [String] メッセージへの出力
215
+ def output
149
216
  @value.to_s
150
217
  end
218
+
219
+ alias s_exp output
151
220
  end
152
221
  end
153
222
  end
@@ -0,0 +1,240 @@
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/common_command/lexer"
11
+ require "bcdice/arithmetic/node"
12
+
13
+ module BCDice
14
+ module Arithmetic
15
+ class Parser < Racc::Parser
16
+
17
+
18
+ def self.parse(source)
19
+ new.parse(source)
20
+ end
21
+
22
+ def parse(source)
23
+ @lexer = BCDice::CommonCommand::Lexer.new(source)
24
+ do_parse()
25
+ rescue ParseError
26
+ nil
27
+ end
28
+
29
+ private
30
+
31
+ def next_token
32
+ @lexer.next_token
33
+ end
34
+ ##### State transition tables begin ###
35
+
36
+ racc_action_table = [
37
+ 8, 17, 8, 12, 13, 4, 5, 4, 5, 7,
38
+ 8, 7, 8, 12, 13, 4, 5, 4, 5, 7,
39
+ 8, 7, 8, 12, 13, 4, 5, 4, 5, 7,
40
+ 8, 7, 8, nil, nil, 4, 5, 4, 5, 7,
41
+ 9, 7, nil, nil, 10, 11, nil, 10, 11, 22,
42
+ 26, 24, 25, 27 ]
43
+
44
+ racc_action_check = [
45
+ 0, 9, 4, 2, 2, 0, 0, 4, 4, 0,
46
+ 5, 4, 7, 18, 18, 5, 5, 7, 7, 5,
47
+ 10, 7, 11, 19, 19, 10, 10, 11, 11, 10,
48
+ 12, 11, 13, nil, nil, 12, 12, 13, 13, 12,
49
+ 1, 13, nil, nil, 16, 16, nil, 1, 1, 16,
50
+ 21, 21, 21, 21 ]
51
+
52
+ racc_action_pointer = [
53
+ -2, 40, -6, nil, 0, 8, nil, 10, nil, 1,
54
+ 18, 20, 28, 30, nil, nil, 37, nil, 4, 14,
55
+ nil, 47, nil, nil, nil, nil, nil, nil ]
56
+
57
+ racc_action_default = [
58
+ -17, -17, -3, -6, -17, -17, -14, -17, -16, -17,
59
+ -17, -17, -17, -17, -12, -13, -17, 28, -1, -2,
60
+ -4, -7, -15, -5, -8, -9, -10, -11 ]
61
+
62
+ racc_goto_table = [
63
+ 14, 15, 23, 1, 18, 19, nil, nil, 20, 21,
64
+ 16 ]
65
+
66
+ racc_goto_check = [
67
+ 3, 3, 4, 1, 2, 2, nil, nil, 3, 3,
68
+ 1 ]
69
+
70
+ racc_goto_pointer = [
71
+ nil, 3, -6, -4, -19, nil ]
72
+
73
+ racc_goto_default = [
74
+ nil, nil, 2, 3, nil, 6 ]
75
+
76
+ racc_reduce_table = [
77
+ 0, 0, :racc_error,
78
+ 3, 14, :_reduce_1,
79
+ 3, 14, :_reduce_2,
80
+ 1, 14, :_reduce_none,
81
+ 3, 15, :_reduce_4,
82
+ 4, 15, :_reduce_5,
83
+ 1, 15, :_reduce_none,
84
+ 0, 17, :_reduce_7,
85
+ 1, 17, :_reduce_8,
86
+ 1, 17, :_reduce_9,
87
+ 1, 17, :_reduce_10,
88
+ 1, 17, :_reduce_11,
89
+ 2, 16, :_reduce_12,
90
+ 2, 16, :_reduce_13,
91
+ 1, 16, :_reduce_none,
92
+ 3, 18, :_reduce_15,
93
+ 1, 18, :_reduce_16 ]
94
+
95
+ racc_reduce_n = 17
96
+
97
+ racc_shift_n = 28
98
+
99
+ racc_token_table = {
100
+ false => 0,
101
+ :error => 1,
102
+ :NUMBER => 2,
103
+ :R => 3,
104
+ :U => 4,
105
+ :C => 5,
106
+ :F => 6,
107
+ :PLUS => 7,
108
+ :MINUS => 8,
109
+ :ASTERISK => 9,
110
+ :SLASH => 10,
111
+ :PARENL => 11,
112
+ :PARENR => 12 }
113
+
114
+ racc_nt_base = 13
115
+
116
+ racc_use_result_var = true
117
+
118
+ Racc_arg = [
119
+ racc_action_table,
120
+ racc_action_check,
121
+ racc_action_default,
122
+ racc_action_pointer,
123
+ racc_goto_table,
124
+ racc_goto_check,
125
+ racc_goto_default,
126
+ racc_goto_pointer,
127
+ racc_nt_base,
128
+ racc_reduce_table,
129
+ racc_token_table,
130
+ racc_shift_n,
131
+ racc_reduce_n,
132
+ racc_use_result_var ]
133
+
134
+ Racc_token_to_s_table = [
135
+ "$end",
136
+ "error",
137
+ "NUMBER",
138
+ "R",
139
+ "U",
140
+ "C",
141
+ "F",
142
+ "PLUS",
143
+ "MINUS",
144
+ "ASTERISK",
145
+ "SLASH",
146
+ "PARENL",
147
+ "PARENR",
148
+ "$start",
149
+ "add",
150
+ "mul",
151
+ "unary",
152
+ "round_type",
153
+ "term" ]
154
+
155
+ Racc_debug_parser = false
156
+
157
+ ##### State transition tables end #####
158
+
159
+ # reduce 0 omitted
160
+
161
+ def _reduce_1(val, _values, result)
162
+ result = Arithmetic::Node::BinaryOp.new(val[0], :+, val[2])
163
+ result
164
+ end
165
+
166
+ def _reduce_2(val, _values, result)
167
+ result = Arithmetic::Node::BinaryOp.new(val[0], :-, val[2])
168
+ result
169
+ end
170
+
171
+ # reduce 3 omitted
172
+
173
+ def _reduce_4(val, _values, result)
174
+ result = Arithmetic::Node::BinaryOp.new(val[0], :*, val[2])
175
+ result
176
+ end
177
+
178
+ def _reduce_5(val, _values, result)
179
+ divied_class = val[3]
180
+ result = divied_class.new(val[0], val[2])
181
+
182
+ result
183
+ end
184
+
185
+ # reduce 6 omitted
186
+
187
+ def _reduce_7(val, _values, result)
188
+ result = Arithmetic::Node::DivideWithGameSystemDefault
189
+ result
190
+ end
191
+
192
+ def _reduce_8(val, _values, result)
193
+ result = Arithmetic::Node::DivideWithCeil
194
+ result
195
+ end
196
+
197
+ def _reduce_9(val, _values, result)
198
+ result = Arithmetic::Node::DivideWithCeil
199
+ result
200
+ end
201
+
202
+ def _reduce_10(val, _values, result)
203
+ result = Arithmetic::Node::DivideWithRound
204
+ result
205
+ end
206
+
207
+ def _reduce_11(val, _values, result)
208
+ result = Arithmetic::Node::DivideWithFloor
209
+ result
210
+ end
211
+
212
+ def _reduce_12(val, _values, result)
213
+ result = val[1]
214
+ result
215
+ end
216
+
217
+ def _reduce_13(val, _values, result)
218
+ result = Arithmetic::Node::Negative.new(val[1])
219
+ result
220
+ end
221
+
222
+ # reduce 14 omitted
223
+
224
+ def _reduce_15(val, _values, result)
225
+ result = val[1]
226
+ result
227
+ end
228
+
229
+ def _reduce_16(val, _values, result)
230
+ result = Arithmetic::Node::Number.new(val[0])
231
+ result
232
+ end
233
+
234
+ def _reduce_none(val, _values, result)
235
+ val[0]
236
+ end
237
+
238
+ end # class Parser
239
+ end # module Arithmetic
240
+ end # module BCDice