Class: BCDice::Command::Parser

Inherits:
Racc::Parser
  • Object
show all
Defined in:
lib/bcdice/command/parser.rb,
lib/bcdice/command/parser.rb

Overview

よくある形式のコマンドのパースを補助するクラス

Examples:

Literal by String

parser = Command::Parser.new("MC", round_type: BCDice::RoundType::FLOOR)
                        .enable_critical
parsed = parser.parse("MC+2*3@30<=10/2-3") #=> <Command::Parsed>

parsed.command #=> "MC"
parsed.modify_number #=> 6
parsed.critical #=> 30
parsed.cmp_op #=> #>=
parsed.target_number #=> 2

Literal by Regexp

parser = Command::Parser.new(/RE\d+/)
parsed = parser.parse("RE44+20") #=> <Command::Parsed>

parsed.command #=> "RE44"
parsed.modify_number #=> 20

Instance Method Summary collapse

Constructor Details

#initialize(*notations, round_type:) ⇒ Parser

Returns a new instance of Parser.

Parameters:

  • notations (Array<String, Regexp>)

    反応するコマンドの表記

  • round_type (Symbol)

    除算での端数の扱い



42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/bcdice/command/parser.rb', line 42

def initialize(*notations, round_type:)
  super()
  @notations = notations
  @round_type = round_type
  @prefix_number = false
  @suffix_number = false
  @need_prefix_number = false
  @need_suffix_number = false
  @modifier = true
  @critical = false
  @fumble = false
  @dollar = false
  @allowed_cmp_op = [nil, :>=, :>, :<=, :<, :==, :!=]
  @question_target = false
end

Instance Method Details

#disable_modifierBCDice::Command::Parser

修正値は受け付けないようにする



60
61
62
63
# File 'lib/bcdice/command/parser.rb', line 60

def disable_modifier
  @modifier = false
  self
end

#enable_criticalBCDice::Command::Parser

@によるクリティカル値の指定を許可する



97
98
99
100
# File 'lib/bcdice/command/parser.rb', line 97

def enable_critical
  @critical = true
  self
end

#enable_dollarBCDice::Command::Parser

$による値の指定を許可する



111
112
113
114
# File 'lib/bcdice/command/parser.rb', line 111

def enable_dollar
  @dollar = true
  self
end

#enable_fumbleBCDice::Command::Parser

#によるファンブル値の指定を許可する



104
105
106
107
# File 'lib/bcdice/command/parser.rb', line 104

def enable_fumble
  @fumble = true
  self
end

#enable_prefix_numberBCDice::Command::Parser

リテラルの前に数値を許可する



67
68
69
70
# File 'lib/bcdice/command/parser.rb', line 67

def enable_prefix_number
  @prefix_number = true
  self
end

#enable_question_targetBCDice::Command::Parser

目標値“?”の指定を許可する



127
128
129
130
# File 'lib/bcdice/command/parser.rb', line 127

def enable_question_target
  @question_target = true
  self
end

#enable_suffix_numberBCDice::Command::Parser

リテラルの後ろに数値を許可する



74
75
76
77
# File 'lib/bcdice/command/parser.rb', line 74

def enable_suffix_number
  @suffix_number = true
  self
end

#has_prefix_numberBCDice::Command::Parser

リテラルの前に数値が必要であると設定する



81
82
83
84
85
# File 'lib/bcdice/command/parser.rb', line 81

def has_prefix_number
  @prefix_number = true
  @need_prefix_number = true
  self
end

#has_suffix_numberBCDice::Command::Parser

リテラルの後ろに数値が必要であると設定する



89
90
91
92
93
# File 'lib/bcdice/command/parser.rb', line 89

def has_suffix_number
  @suffix_number = true
  @need_suffix_number = true
  self
end

#parse(source) ⇒ BCDice::Command::Parsed?

Parameters:

  • source (String)

Returns:



134
135
136
137
138
139
# File 'lib/bcdice/command/parser.rb', line 134

def parse(source)
  @lexer = Lexer.new(source, @notations)
  do_parse()
rescue ParseError, ZeroDivisionError
  nil
end

#restrict_cmp_op_to(*ops) ⇒ BCDice::Command::Parser

使用できる比較演算子を制限する。目標値未入力を許可する場合にはnilを指定する。

Parameters:

  • ops (Array<nil, Symbol>)

    許可する比較演算子の一覧

Returns:



120
121
122
123
# File 'lib/bcdice/command/parser.rb', line 120

def restrict_cmp_op_to(*ops)
  @allowed_cmp_op = ops
  self
end