Class: RaddDjur::Grammar

Inherits:
Object
  • Object
show all
Includes:
Parsers
Defined in:
lib/radd_djur/grammar.rb

Defined Under Namespace

Modules: Parsers Classes: Derivs, ParseError, Parsed, Parser, Result

Constant Summary collapse

INSTANCE_EVAL_USING_AVAILABLE =
begin
  instance_eval(using: RaddDjur::DSL) {}
  true
rescue
  false
end
NO_PARSE =
Result.new

Instance Method Summary collapse

Methods included from Parsers

any_char, char, fail, ret, string

Constructor Details

#initialize(start_symbol, &block) ⇒ Grammar

Returns a new instance of Grammar.



173
174
175
176
177
178
179
180
181
182
183
# File 'lib/radd_djur/grammar.rb', line 173

def initialize(start_symbol, &block)
  @parsers = {}
  @start_symbol = start_symbol
  if block
    if INSTANCE_EVAL_USING_AVAILABLE
      instance_eval(using: RaddDjur::DSL, &block)
    else
      instance_eval(&block)
    end
  end
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(mid, *args) ⇒ Object



201
202
203
# File 'lib/radd_djur/grammar.rb', line 201

def method_missing(mid, *args)
  Parser.new(&mid)
end

Instance Method Details

#define(sym, parser = yield)) ⇒ Object



193
194
195
# File 'lib/radd_djur/grammar.rb', line 193

def define(sym, parser = yield)
  @parsers[sym] = parser.to_parser
end

#parse(str) ⇒ Object



185
186
187
188
189
190
191
# File 'lib/radd_djur/grammar.rb', line 185

def parse(str)
  result = Derivs.new(self, str).send(@start_symbol).force
  if !result.succeeded?
    raise ParseError, "parse error"
  end
  result.value
end

#parser(sym) ⇒ Object



197
198
199
# File 'lib/radd_djur/grammar.rb', line 197

def parser(sym)
  @parsers[sym]
end