Class: TreeHaver::Backends::Parslet::Parser

Inherits:
Object
  • Object
show all
Defined in:
lib/tree_haver/backends/parslet.rb

Overview

Parslet parser wrapper

Wraps Parslet grammar classes to provide a tree-sitter-like API.

Instance Method Summary collapse

Constructor Details

#initializeParser

Create a new Parslet parser instance

Raises:



224
225
226
227
# File 'lib/tree_haver/backends/parslet.rb', line 224

def initialize
  raise TreeHaver::NotAvailable, "parslet gem not available" unless Parslet.available?
  @grammar = nil
end

Instance Method Details

#language=(grammar) ⇒ void

This method returns an undefined value.

Set the grammar for this parser

Accepts either a Parslet::Language wrapper or a raw Parslet grammar class.
When passed a Language wrapper, extracts the grammar_class from it.
When passed a raw grammar class, uses it directly.

This flexibility allows both patterns:
parser.language = TreeHaver::Backends::Parslet::Language.new(TOML::Parslet)
parser.language = TOML::Parslet # Also works

Parameters:

  • grammar (Language, Class)

    Parslet Language wrapper or grammar class



241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
# File 'lib/tree_haver/backends/parslet.rb', line 241

def language=(grammar)
  # Accept Language wrapper or raw grammar class
  actual_grammar = case grammar
  when Language
    grammar.grammar_class
  else
    grammar
  end

  unless actual_grammar.respond_to?(:new)
    raise ArgumentError,
      "Expected Parslet grammar class with new method or Language wrapper, " \
        "got #{grammar.class}"
  end
  @grammar = actual_grammar
end

#parse(source) ⇒ Tree

Parse source code

Parameters:

  • source (String)

    the source code to parse

Returns:

  • (Tree)

    raw backend tree (wrapping happens in TreeHaver::Parser)

Raises:



264
265
266
267
268
269
270
271
272
273
274
275
276
# File 'lib/tree_haver/backends/parslet.rb', line 264

def parse(source)
  raise TreeHaver::NotAvailable, "No grammar loaded" unless @grammar

  begin
    parser_instance = @grammar.new
    parslet_result = parser_instance.parse(source)
    # Return raw Parslet result wrapped in Tree - TreeHaver::Parser will wrap it
    Tree.new(parslet_result, source)
  rescue ::Parslet::ParseFailed => e
    # Re-raise with more context
    raise TreeHaver::Error, "Parse error: #{e.message}"
  end
end

#parse_string(old_tree, source) ⇒ Tree

Parse source code (compatibility with tree-sitter API)

Parslet doesn’t support incremental parsing, so old_tree is ignored.

Parameters:

  • old_tree (TreeHaver::Tree, nil)

    ignored (no incremental parsing support)

  • source (String)

    the source code to parse

Returns:

  • (Tree)

    raw backend tree (wrapping happens in TreeHaver::Parser)



285
286
287
# File 'lib/tree_haver/backends/parslet.rb', line 285

def parse_string(old_tree, source) # rubocop:disable Lint/UnusedMethodArgument
  parse(source)  # Parslet doesn't support incremental parsing
end