Module: EBNF::LL1::Parser::ClassMethods

Defined in:
lib/ebnf/ll1/parser.rb

Overview

DSL for creating terminals and productions

Instance Method Summary collapse

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(method, *args, &block) ⇒ Object (private)



163
164
165
166
167
168
169
170
171
172
173
174
175
176
# File 'lib/ebnf/ll1/parser.rb', line 163

def method_missing(method, *args, &block)
  if @delegate ||= nil
    # special handling when last arg is **options
    params = @delegate.method(method).parameters
    if params.any? {|t, _| t == :keyrest} && args.last.is_a?(Hash)
      opts = args.pop
      @delegate.send(method, *args, **opts, &block)
    else
      @delegate.send(method, *args, &block)
    end
  else
    super
  end
end

Instance Method Details

#eval_with_binding(object) ⇒ Object

Evaluate a handler, delegating to the specified object. This is necessary so that handlers can operate within the binding context of the parser in which they’re invoked.

Parameters:

  • object (Object)

Returns:

  • (Object)


156
157
158
159
# File 'lib/ebnf/ll1/parser.rb', line 156

def eval_with_binding(object)
  @delegate = object
  object.instance_eval {yield}
end

#patternsObject



65
# File 'lib/ebnf/ll1/parser.rb', line 65

def patterns; @patterns || []; end

#production(term) {|input, current, block| ... } ⇒ Object

Defines a production called when production of associated terminals and non-terminals has completed with data from previous production along with data defined for the current production. Block is called in an evaluation block from the enclosing parser.

Yield to generate a triple

Parameters:

  • term (Symbol)

    Term which is a key in the branch table

Yields:

  • (input, current, block)

Yield Parameters:

  • input (Hash)

    A Hash containing input from the parent production

  • current (Hash)

    A Hash defined for the current production, during :start may be initialized with data to pass to further productions, during :finish, it contains data placed by earlier productions

  • block (Proc)

    Block passed to initialization for yielding to calling parser. Should conform to the yield specs for #initialize



146
147
148
149
# File 'lib/ebnf/ll1/parser.rb', line 146

def production(term, &block)
  @production_handlers ||= {}
  @production_handlers[term] = block
end

#production_handlersObject



63
# File 'lib/ebnf/ll1/parser.rb', line 63

def production_handlers; @production_handlers || {}; end

#start_handlersObject



62
# File 'lib/ebnf/ll1/parser.rb', line 62

def start_handlers; @start_handlers || {}; end

#start_production(term) {|input, current, block| ... } ⇒ Object

Defines a production called at the beggining of a particular production with data from previous production along with data defined for the current production. Block is called in an evaluation block from the enclosing parser.

Yield to generate a triple

Parameters:

  • term (Symbol)

    Term which is a key in the branch table

Yields:

  • (input, current, block)

Yield Parameters:

  • input (Hash)

    A Hash containing input from the parent production

  • current (Hash)

    A Hash defined for the current production, during :start may be initialized with data to pass to further productions, during :finish, it contains data placed by earlier productions

  • block (Proc)

    Block passed to initialization for yielding to calling parser. Should conform to the yield specs for #initialize



121
122
123
124
# File 'lib/ebnf/ll1/parser.rb', line 121

def start_production(term, &block)
  @start_handlers ||= {}
  @start_handlers[term] = block
end

#terminal(term, regexp, **options) {|term, token, input, block| ... } ⇒ Object

Defines the pattern for a terminal node and a block to be invoked when ther terminal is encountered. If the block is missing, the value of the terminal will be placed on the input hash to be returned to a previous production. Block is called in an evaluation block from the enclosing parser.

Parameters:

  • term (Symbol, String)

    Defines a terminal production, which appears as within a sequence in the branch table

  • regexp (Regexp)

    Pattern used to scan for this terminal

  • options (Hash)

Options Hash (**options):

  • :map (Hash{String => String}) — default: {}

    A mapping from terminals, in lower-case form, to their canonical value

  • :unescape (Boolean)

    Cause strings and codepoints to be unescaped.

Yields:

  • (term, token, input, block)

Yield Parameters:

  • term (Symbol)

    A symbol indicating the production which referenced this terminal

  • token (String)

    The scanned token

  • input (Hash)

    A Hash containing input from the parent production

  • block (Proc)

    Block passed to initialization for yielding to calling parser. Should conform to the yield specs for #initialize



94
95
96
97
98
99
100
# File 'lib/ebnf/ll1/parser.rb', line 94

def terminal(term, regexp, **options, &block)
  @patterns ||= []
  # Passed in order to define evaulation sequence
  @patterns << EBNF::LL1::Lexer::Terminal.new(term, regexp, **options)
  @terminal_handlers ||= {}
  @terminal_handlers[term] = block if block_given?
end

#terminal_handlersObject



64
# File 'lib/ebnf/ll1/parser.rb', line 64

def terminal_handlers; @terminal_handlers || {}; end