Class: Rley::RGN::Parser

Inherits:
Object
  • Object
show all
Defined in:
lib/rley/rgn/parser.rb

Overview

A RRN (Rley Rule Notation) parser that produce concrete parse trees. Concrete parse trees are the default kind of parse tree generated by the Rley library. They consist of two node types only:

  • NonTerminalNode
  • TerminalNode A NonTerminalNode has zero or more child nodes (called subnodes) A TerminalNode is leaf node, that is, it has no child node. While concrete parse tree nodes can be generated out of the box, they have the following drawbacks:
  • Generic node classes that aren't always suited for the needs of the language being processing.
  • Concrete parse tree tend to be deeply nested, which may complicate further processing.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeParser

Returns a new instance of Parser.



27
28
29
30
31
32
33
34
35
36
# File 'lib/rley/rgn/parser.rb', line 27

def initialize
  # Create a Rley facade object
  @engine = Rley::Engine.new do |cfg|
    cfg.diagnose = true
    cfg.repr_builder = RGN::ASTBuilder
  end

  # Step 1. Load RGN grammar
  @engine.use_grammar(Rley::RGN::RGNGrammar)
end

Instance Attribute Details

#engineRley::Engine (readonly)

Returns A facade object for the Rley parsing library.

Returns:

  • (Rley::Engine)

    A facade object for the Rley parsing library



25
26
27
# File 'lib/rley/rgn/parser.rb', line 25

def engine
  @engine
end

Instance Method Details

#parse(source) ⇒ Rley::ParseTree

Parse the given RGN snippet into a parse tree.

Parameters:

  • source (String)

    Snippet to parse

Returns:

  • (Rley::ParseTree)

    A parse tree equivalent to the RGN input.



41
42
43
44
45
46
47
48
49
50
51
52
53
# File 'lib/rley/rgn/parser.rb', line 41

def parse(source)
  lexer = Tokenizer.new(source)
  result = engine.parse(lexer.tokens)

  unless result.success?
    # Stop if the parse failed...
    line1 = "Parsing failed\n"
    line2 = "Reason: #{result.failure_reason.message}"
    raise SyntaxError, line1 + line2
  end

  return engine.convert(result) # engine.to_ptree(result)
end