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

Sign up to get free protection for your applications and to get access to all the features.
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