Module: TreeHaver::Backends::Citrus

Defined in:
lib/tree_haver/backends/citrus.rb

Overview

Note:

This backend requires a Citrus grammar for the specific language

Citrus backend using pure Ruby PEG parser

This backend wraps Citrus-based parsers (like toml-rb) to provide a pure Ruby alternative to tree-sitter. Citrus is a PEG (Parsing Expression Grammar) parser generator written in Ruby.

Unlike tree-sitter backends which are language-agnostic runtime parsers, Citrus parsers are grammar-specific and compiled into Ruby code. Each language needs its own Citrus grammar (e.g., toml-rb for TOML).

Examples:

Using with toml-rb

require "toml-rb"

parser = TreeHaver::Parser.new
# For Citrus, "language" is actually a grammar module
parser.language = TomlRB::Document
tree = parser.parse(toml_source)

See Also:

Defined Under Namespace

Classes: Language, Node, Parser, Tree

Class Method Summary collapse

Class Method Details

.available?Boolean

Returns:

  • (Boolean)


40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# File 'lib/tree_haver/backends/citrus.rb', line 40

def available?
  return @loaded if @load_attempted

  @load_attempted = true
  begin
    require 'citrus'
    @loaded = true
  rescue LoadError
    @loaded = false
    # simplecov:disable defensive code - StandardError during require is extremely rare
  rescue StandardError
    @loaded = false
    # simplecov:enable
  end
  @loaded
end

.capabilitiesHash{Symbol => Object}

Get capabilities supported by this backend

Examples:

TreeHaver::Backends::Citrus.capabilities
# => { backend: :citrus, query: false, bytes_field: true, incremental: false, comment_support: :none }

Returns:

  • (Hash{Symbol => Object})

    capability map



72
73
74
75
76
77
78
79
80
81
82
83
# File 'lib/tree_haver/backends/citrus.rb', line 72

def capabilities
  return {} unless available?

  {
    backend: :citrus,
    query: false,          # Citrus doesn't have a query API like tree-sitter
    bytes_field: true,     # Citrus::Match provides offset and length
    incremental: false,    # Citrus doesn't support incremental parsing
    pure_ruby: true,       # Citrus is pure Ruby (portable)
    comment_support: :none
  }
end

.reset!void

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

This method returns an undefined value.

Reset the load state (primarily for testing)



61
62
63
64
# File 'lib/tree_haver/backends/citrus.rb', line 61

def reset!
  @load_attempted = false
  @loaded = false
end