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)



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

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)


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

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

#patternsObject



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

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



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

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

#production_handlersObject



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

def production_handlers; @@production_handlers || {}; end

#start_handlersObject



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

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



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

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



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

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



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

def terminal_handlers; @@terminal_handlers || {}; end