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)



123
124
125
126
127
128
129
# File 'lib/ebnf/ll1/parser.rb', line 123

def method_missing(method, *args, &block)
  if @delegate ||= nil
    @delegate.send method, *args, &block
  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)


116
117
118
119
# File 'lib/ebnf/ll1/parser.rb', line 116

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

#patternsObject



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

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



106
107
108
109
# File 'lib/ebnf/ll1/parser.rb', line 106

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

#production_handlersObject



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

def production_handlers; @production_handlers || {}; end

#start_handlersObject



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

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



81
82
83
84
# File 'lib/ebnf/ll1/parser.rb', line 81

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) (defaults to: {})

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



54
55
56
57
58
59
60
# File 'lib/ebnf/ll1/parser.rb', line 54

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



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

def terminal_handlers; @terminal_handlers || {}; end