Class: Loxxy::FrontEnd::Parser

Inherits:
Object
  • Object
show all
Defined in:
lib/loxxy/front_end/parser.rb

Overview

A Lox 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/loxxy/front_end/parser.rb', line 27

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

  # Step 1. Load Lox grammar
  @engine.use_grammar(Loxxy::FrontEnd::Grammar)
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/loxxy/front_end/parser.rb', line 25

def engine
  @engine
end

Instance Method Details

#parse(source) ⇒ Rley::ParseTree

Parse the given Lox program into a parse tree.

Parameters:

  • source (String)

    Lox program to parse

Returns:

  • (Rley::ParseTree)

    A parse tree equivalent to the Lox input.



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

def parse(source)
  lexer = Scanner.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