Class: Rley::RGN::Parser
- Inherits:
-
Object
- Object
- Rley::RGN::Parser
- 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
-
#engine ⇒ Rley::Engine
readonly
A facade object for the Rley parsing library.
Instance Method Summary collapse
-
#initialize ⇒ Parser
constructor
A new instance of Parser.
-
#parse(source) ⇒ Rley::ParseTree
Parse the given RGN snippet into a parse tree.
Constructor Details
#initialize ⇒ Parser
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
#engine ⇒ Rley::Engine (readonly)
Returns 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.
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.}" raise SyntaxError, line1 + line2 end return engine.convert(result) # engine.to_ptree(result) end |