parsanol 1.3.13-arm-linux
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/HISTORY.txt +98 -0
- data/LICENSE +23 -0
- data/README.adoc +905 -0
- data/Rakefile +141 -0
- data/lib/parsanol/3.2/parsanol_native.so +0 -0
- data/lib/parsanol/3.3/parsanol_native.so +0 -0
- data/lib/parsanol/3.4/parsanol_native.so +0 -0
- data/lib/parsanol/4.0/parsanol_native.so +0 -0
- data/lib/parsanol/ast_visitor.rb +122 -0
- data/lib/parsanol/atoms/alternative.rb +123 -0
- data/lib/parsanol/atoms/base.rb +208 -0
- data/lib/parsanol/atoms/can_flatten.rb +194 -0
- data/lib/parsanol/atoms/capture.rb +38 -0
- data/lib/parsanol/atoms/context.rb +357 -0
- data/lib/parsanol/atoms/context_optimized.rb +38 -0
- data/lib/parsanol/atoms/custom.rb +110 -0
- data/lib/parsanol/atoms/cut.rb +66 -0
- data/lib/parsanol/atoms/dsl.rb +96 -0
- data/lib/parsanol/atoms/dynamic.rb +39 -0
- data/lib/parsanol/atoms/entity.rb +75 -0
- data/lib/parsanol/atoms/ignored.rb +37 -0
- data/lib/parsanol/atoms/infix.rb +167 -0
- data/lib/parsanol/atoms/lookahead.rb +85 -0
- data/lib/parsanol/atoms/named.rb +74 -0
- data/lib/parsanol/atoms/re.rb +83 -0
- data/lib/parsanol/atoms/repetition.rb +277 -0
- data/lib/parsanol/atoms/scope.rb +35 -0
- data/lib/parsanol/atoms/sequence.rb +195 -0
- data/lib/parsanol/atoms/str.rb +109 -0
- data/lib/parsanol/atoms/visitor.rb +91 -0
- data/lib/parsanol/atoms.rb +46 -0
- data/lib/parsanol/buffer.rb +133 -0
- data/lib/parsanol/builder_callbacks.rb +353 -0
- data/lib/parsanol/cause.rb +122 -0
- data/lib/parsanol/context.rb +39 -0
- data/lib/parsanol/convenience.rb +36 -0
- data/lib/parsanol/edit_tracker.rb +111 -0
- data/lib/parsanol/error_reporter/contextual.rb +99 -0
- data/lib/parsanol/error_reporter/deepest.rb +120 -0
- data/lib/parsanol/error_reporter/tree.rb +63 -0
- data/lib/parsanol/error_reporter.rb +100 -0
- data/lib/parsanol/expression/treetop.rb +154 -0
- data/lib/parsanol/expression.rb +106 -0
- data/lib/parsanol/fast_mode.rb +187 -0
- data/lib/parsanol/first_set.rb +79 -0
- data/lib/parsanol/grammar_builder.rb +179 -0
- data/lib/parsanol/incremental_parser.rb +182 -0
- data/lib/parsanol/interval_tree.rb +226 -0
- data/lib/parsanol/lazy_result.rb +179 -0
- data/lib/parsanol/mermaid.rb +142 -0
- data/lib/parsanol/native/batch_decoder.rb +255 -0
- data/lib/parsanol/native/dynamic.rb +238 -0
- data/lib/parsanol/native/parser.rb +102 -0
- data/lib/parsanol/native/serializer.rb +252 -0
- data/lib/parsanol/native/transformer.rb +604 -0
- data/lib/parsanol/native/types.rb +29 -0
- data/lib/parsanol/native.rb +223 -0
- data/lib/parsanol/optimizer.rb +85 -0
- data/lib/parsanol/optimizers/choice_optimizer.rb +78 -0
- data/lib/parsanol/optimizers/cut_inserter.rb +182 -0
- data/lib/parsanol/optimizers/lookahead_optimizer.rb +56 -0
- data/lib/parsanol/optimizers/quantifier_optimizer.rb +60 -0
- data/lib/parsanol/optimizers/sequence_optimizer.rb +97 -0
- data/lib/parsanol/options/zero_copy.rb +127 -0
- data/lib/parsanol/options.rb +21 -0
- data/lib/parsanol/parallel.rb +128 -0
- data/lib/parsanol/parser.rb +242 -0
- data/lib/parsanol/parslet.rb +151 -0
- data/lib/parsanol/pattern/binding.rb +91 -0
- data/lib/parsanol/pattern.rb +162 -0
- data/lib/parsanol/pool.rb +219 -0
- data/lib/parsanol/pools/array_pool.rb +75 -0
- data/lib/parsanol/pools/buffer_pool.rb +182 -0
- data/lib/parsanol/pools/position_pool.rb +92 -0
- data/lib/parsanol/pools/slice_pool.rb +64 -0
- data/lib/parsanol/position.rb +94 -0
- data/lib/parsanol/resettable.rb +29 -0
- data/lib/parsanol/result.rb +46 -0
- data/lib/parsanol/result_builder.rb +208 -0
- data/lib/parsanol/result_stream.rb +266 -0
- data/lib/parsanol/rig/rspec.rb +71 -0
- data/lib/parsanol/rope.rb +81 -0
- data/lib/parsanol/scope.rb +104 -0
- data/lib/parsanol/slice.rb +160 -0
- data/lib/parsanol/source/line_cache.rb +102 -0
- data/lib/parsanol/source.rb +185 -0
- data/lib/parsanol/source_location.rb +167 -0
- data/lib/parsanol/streaming_parser.rb +124 -0
- data/lib/parsanol/string_view.rb +198 -0
- data/lib/parsanol/transform.rb +226 -0
- data/lib/parsanol/version.rb +5 -0
- data/lib/parsanol/wasm/README.md +80 -0
- data/lib/parsanol/wasm/package.json +51 -0
- data/lib/parsanol/wasm/parsanol.js +252 -0
- data/lib/parsanol/wasm/parslet.d.ts +129 -0
- data/lib/parsanol/wasm_parser.rb +240 -0
- data/lib/parsanol.rb +278 -0
- data/parsanol.gemspec +67 -0
- metadata +279 -0
data/lib/parsanol.rb
ADDED
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# Parsanol - A high-performance PEG parser construction library for Ruby.
|
|
4
|
+
#
|
|
5
|
+
# Typical usage:
|
|
6
|
+
#
|
|
7
|
+
# require 'parsanol'
|
|
8
|
+
#
|
|
9
|
+
# class MyParser < Parsanol::Parser
|
|
10
|
+
# rule(:a) { str('a').repeat }
|
|
11
|
+
# root(:a)
|
|
12
|
+
# end
|
|
13
|
+
#
|
|
14
|
+
# result = MyParser.new.parse('aaaa') # => 'aaaa'@0
|
|
15
|
+
#
|
|
16
|
+
# Parsanol provides a declarative DSL for constructing parsers using PEG
|
|
17
|
+
# (Parsing Expression Grammar) semantics. The library is designed as a
|
|
18
|
+
# high-performance, feature-rich alternative to Parslet.
|
|
19
|
+
#
|
|
20
|
+
# == Two-Stage Parsing
|
|
21
|
+
#
|
|
22
|
+
# Parsing is typically done in two stages:
|
|
23
|
+
#
|
|
24
|
+
# 1. Parse the input string to produce an intermediate tree
|
|
25
|
+
# 2. Transform the tree into an application-specific AST
|
|
26
|
+
#
|
|
27
|
+
# This separation allows grammar changes without affecting downstream code.
|
|
28
|
+
#
|
|
29
|
+
# == Error Handling
|
|
30
|
+
#
|
|
31
|
+
# Failed parses raise {Parsanol::ParseFailed} with detailed error information:
|
|
32
|
+
#
|
|
33
|
+
# begin
|
|
34
|
+
# parser.parse(invalid_input)
|
|
35
|
+
# rescue Parsanol::ParseFailed => e
|
|
36
|
+
# puts e.parse_failure_cause.ascii_tree
|
|
37
|
+
# end
|
|
38
|
+
#
|
|
39
|
+
# Inspired by Parslet (MIT License).
|
|
40
|
+
|
|
41
|
+
module Parsanol
|
|
42
|
+
# Hook to extend including classes with ClassMethods.
|
|
43
|
+
def self.included(base)
|
|
44
|
+
base.extend(ClassMethods)
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
# Exception raised when parsing fails. Contains detailed error information
|
|
48
|
+
# in the #parse_failure_cause attribute.
|
|
49
|
+
class ParseFailed < StandardError
|
|
50
|
+
def initialize(message, cause = nil)
|
|
51
|
+
super(message)
|
|
52
|
+
@parse_failure_cause = cause
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
# Detailed cause of the parse failure.
|
|
56
|
+
# @return [Parsanol::Cause]
|
|
57
|
+
attr_reader :parse_failure_cause
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
# Class methods added to classes that include Parsanol.
|
|
61
|
+
module ClassMethods
|
|
62
|
+
# Enable automatic rule optimization for all rules in this parser.
|
|
63
|
+
# Optimizations include quantifier simplification, sequence flattening,
|
|
64
|
+
# choice reordering, and lookahead simplification.
|
|
65
|
+
#
|
|
66
|
+
# NOTE: Optimizations are DISABLED BY DEFAULT as of v3.1.0.
|
|
67
|
+
# Use this method to opt-in for complex grammars.
|
|
68
|
+
def optimize_rules!(enable = true)
|
|
69
|
+
@optimize_rules = enable
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
# Disable automatic rule optimization.
|
|
73
|
+
def disable_optimization!
|
|
74
|
+
@optimize_rules = false
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
# Check if rule optimization is enabled.
|
|
78
|
+
# @return [Boolean]
|
|
79
|
+
def optimize_rules?
|
|
80
|
+
@optimize_rules = false if @optimize_rules.nil?
|
|
81
|
+
@optimize_rules
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
# Define a named grammar rule. Creates a method that returns an Entity atom.
|
|
85
|
+
# Rules are memoized for efficiency.
|
|
86
|
+
#
|
|
87
|
+
# @param name [Symbol] the rule name
|
|
88
|
+
# @param opts [Hash] options (:label for custom labeling)
|
|
89
|
+
# @yield block that returns the rule's parser atom
|
|
90
|
+
def rule(name, opts = {}, &definition)
|
|
91
|
+
undef_method name if method_defined? name
|
|
92
|
+
define_method(name) do
|
|
93
|
+
@rule_cache ||= {}
|
|
94
|
+
return @rule_cache[name] if @rule_cache.key?(name)
|
|
95
|
+
|
|
96
|
+
wrapper = proc {
|
|
97
|
+
atom = instance_eval(&definition)
|
|
98
|
+
|
|
99
|
+
if self.class.optimize_rules?
|
|
100
|
+
atom = Parsanol::Optimizer.simplify_quantifiers(atom)
|
|
101
|
+
atom = Parsanol::Optimizer.simplify_sequences(atom)
|
|
102
|
+
atom = Parsanol::Optimizer.simplify_choices(atom)
|
|
103
|
+
atom = Parsanol::Optimizer.simplify_lookaheads(atom)
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
atom
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
@rule_cache[name] = Atoms::Entity.new(name, opts[:label], &wrapper)
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
# Helper class for bracket notation character class matching.
|
|
115
|
+
# @api private
|
|
116
|
+
class CharacterClassBuilder
|
|
117
|
+
def [](chars)
|
|
118
|
+
Atoms::Re.new("[#{chars}]")
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
# Creates a character class matcher. Supports both method and bracket forms.
|
|
123
|
+
#
|
|
124
|
+
# @overload match(pattern)
|
|
125
|
+
# @param pattern [String] regex character class
|
|
126
|
+
# @overload match[]
|
|
127
|
+
# @return [CharacterClassBuilder] builder for bracket notation
|
|
128
|
+
# @return [Parsanol::Atoms::Re] regex atom
|
|
129
|
+
def match(pattern = nil)
|
|
130
|
+
return CharacterClassBuilder.new unless pattern
|
|
131
|
+
|
|
132
|
+
Atoms::Re.new(pattern)
|
|
133
|
+
end
|
|
134
|
+
module_function :match
|
|
135
|
+
|
|
136
|
+
# Creates a literal string matcher.
|
|
137
|
+
#
|
|
138
|
+
# @param literal [String] the string to match
|
|
139
|
+
# @return [Parsanol::Atoms::Str] string atom
|
|
140
|
+
def str(literal)
|
|
141
|
+
Atoms::Str.new(literal)
|
|
142
|
+
end
|
|
143
|
+
module_function :str
|
|
144
|
+
|
|
145
|
+
# Creates a matcher for any single character.
|
|
146
|
+
#
|
|
147
|
+
# @return [Parsanol::Atoms::Re] regex atom matching '.'
|
|
148
|
+
def any
|
|
149
|
+
Atoms::Re.new(".")
|
|
150
|
+
end
|
|
151
|
+
module_function :any
|
|
152
|
+
|
|
153
|
+
# Creates a new variable scope for captures. Inner captures shadow outer
|
|
154
|
+
# ones with the same name during the block's execution.
|
|
155
|
+
#
|
|
156
|
+
# @yield block containing scoped parsing
|
|
157
|
+
# @return [Parsanol::Atoms::Scope] scope atom
|
|
158
|
+
def scope(&block)
|
|
159
|
+
Atoms::Scope.new(block)
|
|
160
|
+
end
|
|
161
|
+
module_function :scope
|
|
162
|
+
|
|
163
|
+
# Creates a dynamic parser that is evaluated at parse time.
|
|
164
|
+
# Useful for context-dependent parsing. Use sparingly due to performance.
|
|
165
|
+
#
|
|
166
|
+
# @yield block returning a parser atom or parse result
|
|
167
|
+
# @return [Parsanol::Atoms::Dynamic] dynamic atom
|
|
168
|
+
def dynamic(&block)
|
|
169
|
+
Atoms::Dynamic.new(block)
|
|
170
|
+
end
|
|
171
|
+
module_function :dynamic
|
|
172
|
+
|
|
173
|
+
# Creates an infix expression parser with operator precedence.
|
|
174
|
+
# Operators are specified as [atom, precedence, associativity] tuples.
|
|
175
|
+
#
|
|
176
|
+
# @param operand [Parsanol::Atoms::Base] parser for operands
|
|
177
|
+
# @param operators [Array<Array>] operator definitions
|
|
178
|
+
# @yield optional block to customize result tree structure
|
|
179
|
+
# @return [Parsanol::Atoms::Infix] infix parser
|
|
180
|
+
def infix_expression(operand, *operators, &)
|
|
181
|
+
Atoms::Infix.new(operand, operators, &)
|
|
182
|
+
end
|
|
183
|
+
module_function :infix_expression
|
|
184
|
+
|
|
185
|
+
# Creates a pattern binding for sequence matching in transforms.
|
|
186
|
+
# Only matches array values, not single elements.
|
|
187
|
+
#
|
|
188
|
+
# @param name [Symbol] binding variable name
|
|
189
|
+
# @return [Parsanol::Pattern::SequenceBind] sequence pattern
|
|
190
|
+
def sequence(name)
|
|
191
|
+
Pattern::SequenceBind.new(name)
|
|
192
|
+
end
|
|
193
|
+
module_function :sequence
|
|
194
|
+
|
|
195
|
+
# Creates a pattern binding for simple (leaf) value matching.
|
|
196
|
+
# Matches anything that is not a Hash or Array.
|
|
197
|
+
#
|
|
198
|
+
# @param name [Symbol] binding variable name
|
|
199
|
+
# @return [Parsanol::Pattern::SimpleBind] simple pattern
|
|
200
|
+
def simple(name)
|
|
201
|
+
Pattern::SimpleBind.new(name)
|
|
202
|
+
end
|
|
203
|
+
module_function :simple
|
|
204
|
+
|
|
205
|
+
# Creates a pattern binding that matches any subtree.
|
|
206
|
+
# This is the most permissive pattern type.
|
|
207
|
+
#
|
|
208
|
+
# @param name [Symbol] binding variable name
|
|
209
|
+
# @return [Parsanol::Pattern::SubtreeBind] subtree pattern
|
|
210
|
+
def subtree(name)
|
|
211
|
+
Pattern::SubtreeBind.new(name)
|
|
212
|
+
end
|
|
213
|
+
module_function :subtree
|
|
214
|
+
|
|
215
|
+
# Parses a treetop-style expression string and returns the corresponding atom.
|
|
216
|
+
#
|
|
217
|
+
# This is a convenience method for defining parsers using treetop syntax.
|
|
218
|
+
# The expression parser is pure Ruby (not Rust-accelerated) since it runs only
|
|
219
|
+
# at grammar definition time. The resulting atoms can be used with native parsing.
|
|
220
|
+
#
|
|
221
|
+
# @note Whitespace is required before operators: 'a' ? not 'a'?
|
|
222
|
+
#
|
|
223
|
+
# @example Basic usage
|
|
224
|
+
# exp("'a' 'b' ?") # => str('a') >> str('b').maybe
|
|
225
|
+
#
|
|
226
|
+
# @example With Rust-accelerated parsing
|
|
227
|
+
# atom = exp("'a' +")
|
|
228
|
+
# Native.parse_with_grammar(atom, 'aaa') # Uses Rust extension
|
|
229
|
+
#
|
|
230
|
+
# @param str [String] a treetop expression string
|
|
231
|
+
# @return [Parsanol::Atoms::Base] the corresponding parser atom
|
|
232
|
+
# @see Parsanol::Expression for full syntax documentation
|
|
233
|
+
def exp(str)
|
|
234
|
+
Expression.new(str).to_parslet
|
|
235
|
+
end
|
|
236
|
+
module_function :exp
|
|
237
|
+
|
|
238
|
+
autoload :Expression, "parsanol/expression"
|
|
239
|
+
end
|
|
240
|
+
|
|
241
|
+
require "parsanol/version"
|
|
242
|
+
require "parsanol/resettable"
|
|
243
|
+
require "parsanol/result"
|
|
244
|
+
require "parsanol/slice"
|
|
245
|
+
require "parsanol/string_view"
|
|
246
|
+
require "parsanol/rope"
|
|
247
|
+
require "parsanol/pool"
|
|
248
|
+
require "parsanol/pools/slice_pool"
|
|
249
|
+
require "parsanol/pools/array_pool"
|
|
250
|
+
require "parsanol/pools/position_pool"
|
|
251
|
+
require "parsanol/buffer"
|
|
252
|
+
require "parsanol/pools/buffer_pool"
|
|
253
|
+
require "parsanol/lazy_result"
|
|
254
|
+
require "parsanol/result_builder"
|
|
255
|
+
require "parsanol/first_set"
|
|
256
|
+
require "parsanol/cause"
|
|
257
|
+
require "parsanol/source"
|
|
258
|
+
require "parsanol/atoms"
|
|
259
|
+
require "parsanol/pattern"
|
|
260
|
+
require "parsanol/pattern/binding"
|
|
261
|
+
require "parsanol/transform"
|
|
262
|
+
require "parsanol/parser"
|
|
263
|
+
require "parsanol/error_reporter"
|
|
264
|
+
require "parsanol/scope"
|
|
265
|
+
require "parsanol/optimizer"
|
|
266
|
+
require "parsanol/options"
|
|
267
|
+
require "parsanol/native"
|
|
268
|
+
|
|
269
|
+
# New features (require native extension for full functionality)
|
|
270
|
+
require "parsanol/source_location"
|
|
271
|
+
require "parsanol/grammar_builder"
|
|
272
|
+
require "parsanol/streaming_parser"
|
|
273
|
+
require "parsanol/incremental_parser"
|
|
274
|
+
require "parsanol/builder_callbacks"
|
|
275
|
+
require "parsanol/parallel"
|
|
276
|
+
|
|
277
|
+
# Add GrammarBuilder DSL to Parsanol module
|
|
278
|
+
Parsanol.extend(Parsanol::GrammarBuilderDSL)
|
data/parsanol.gemspec
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "lib/parsanol/version"
|
|
4
|
+
|
|
5
|
+
Gem::Specification.new do |spec|
|
|
6
|
+
spec.name = "parsanol"
|
|
7
|
+
spec.version = Parsanol::VERSION
|
|
8
|
+
spec.platform = Gem::Platform::RUBY
|
|
9
|
+
|
|
10
|
+
spec.authors = ["Ribose Inc."]
|
|
11
|
+
spec.email = ["open.source@ribose.com"]
|
|
12
|
+
|
|
13
|
+
spec.summary = "Parser construction library with great error reporting in Ruby."
|
|
14
|
+
spec.description = "A small Ruby library for constructing parsers in the PEG (Parsing Expression Grammar) fashion. " \
|
|
15
|
+
"Parsanol provides Parslet-compatible API with additional features including " \
|
|
16
|
+
"static frozen parsers and dynamic parsers, with optional Rust native extension for improved performance."
|
|
17
|
+
spec.homepage = "https://github.com/parsanol/parsanol-ruby"
|
|
18
|
+
spec.license = "MIT"
|
|
19
|
+
|
|
20
|
+
spec.metadata = {
|
|
21
|
+
"bug_tracker_uri" => "https://github.com/parsanol/parsanol-ruby/issues",
|
|
22
|
+
"changelog_uri" => "https://github.com/parsanol/parsanol-ruby/blob/main/HISTORY.txt",
|
|
23
|
+
"documentation_uri" => "https://parsanol.github.io/parsanol-ruby/",
|
|
24
|
+
"homepage_uri" => "https://github.com/parsanol/parsanol-ruby",
|
|
25
|
+
"source_code_uri" => "https://github.com/parsanol/parsanol-ruby",
|
|
26
|
+
"rubygems_mfa_required" => "true",
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
# Rust extension
|
|
30
|
+
spec.extensions = ["ext/parsanol_native/extconf.rb"]
|
|
31
|
+
|
|
32
|
+
spec.files = Dir.glob("{lib,ext}/**/*") + %w[
|
|
33
|
+
HISTORY.txt
|
|
34
|
+
LICENSE
|
|
35
|
+
Rakefile
|
|
36
|
+
README.adoc
|
|
37
|
+
parsanol.gemspec
|
|
38
|
+
Cargo.toml
|
|
39
|
+
Cargo.lock
|
|
40
|
+
]
|
|
41
|
+
spec.files.reject! { |f| File.directory?(f) }
|
|
42
|
+
spec.files.reject! { |f| f =~ /\.(dll|so|dylib|lib|bundle)\Z/ }
|
|
43
|
+
spec.require_paths = ["lib"]
|
|
44
|
+
|
|
45
|
+
spec.required_ruby_version = ">= 3.2.0"
|
|
46
|
+
|
|
47
|
+
# Required for Rust extension
|
|
48
|
+
spec.add_dependency "rb_sys", "~> 0.9.39"
|
|
49
|
+
|
|
50
|
+
spec.add_development_dependency "rake", "~> 13.0"
|
|
51
|
+
spec.add_development_dependency "rake-compiler", "~> 1.2.0"
|
|
52
|
+
spec.add_development_dependency "rdoc", "~> 6.0"
|
|
53
|
+
spec.add_development_dependency "rspec", "~> 3.0"
|
|
54
|
+
|
|
55
|
+
# For code style checking
|
|
56
|
+
spec.add_development_dependency "rubocop", "~> 1.0"
|
|
57
|
+
|
|
58
|
+
# For Parslet compatibility verification
|
|
59
|
+
spec.add_development_dependency "parslet", "~> 2.0.0"
|
|
60
|
+
|
|
61
|
+
# For benchmarking
|
|
62
|
+
spec.add_development_dependency "benchmark-ips", "~> 2.0"
|
|
63
|
+
|
|
64
|
+
# For type checking
|
|
65
|
+
spec.add_development_dependency "rbs", "~> 3.0"
|
|
66
|
+
spec.add_development_dependency "steep", "~> 1.0"
|
|
67
|
+
end
|
metadata
ADDED
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: parsanol
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 1.3.13
|
|
5
|
+
platform: arm-linux
|
|
6
|
+
authors:
|
|
7
|
+
- Ribose Inc.
|
|
8
|
+
autorequire:
|
|
9
|
+
bindir: bin
|
|
10
|
+
cert_chain: []
|
|
11
|
+
date: 2026-09-14 00:00:00.000000000 Z
|
|
12
|
+
dependencies:
|
|
13
|
+
- !ruby/object:Gem::Dependency
|
|
14
|
+
name: rake
|
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
|
16
|
+
requirements:
|
|
17
|
+
- - "~>"
|
|
18
|
+
- !ruby/object:Gem::Version
|
|
19
|
+
version: '13.0'
|
|
20
|
+
type: :development
|
|
21
|
+
prerelease: false
|
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
23
|
+
requirements:
|
|
24
|
+
- - "~>"
|
|
25
|
+
- !ruby/object:Gem::Version
|
|
26
|
+
version: '13.0'
|
|
27
|
+
- !ruby/object:Gem::Dependency
|
|
28
|
+
name: rake-compiler
|
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
|
30
|
+
requirements:
|
|
31
|
+
- - "~>"
|
|
32
|
+
- !ruby/object:Gem::Version
|
|
33
|
+
version: 1.2.0
|
|
34
|
+
type: :development
|
|
35
|
+
prerelease: false
|
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
37
|
+
requirements:
|
|
38
|
+
- - "~>"
|
|
39
|
+
- !ruby/object:Gem::Version
|
|
40
|
+
version: 1.2.0
|
|
41
|
+
- !ruby/object:Gem::Dependency
|
|
42
|
+
name: rdoc
|
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
|
44
|
+
requirements:
|
|
45
|
+
- - "~>"
|
|
46
|
+
- !ruby/object:Gem::Version
|
|
47
|
+
version: '6.0'
|
|
48
|
+
type: :development
|
|
49
|
+
prerelease: false
|
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
51
|
+
requirements:
|
|
52
|
+
- - "~>"
|
|
53
|
+
- !ruby/object:Gem::Version
|
|
54
|
+
version: '6.0'
|
|
55
|
+
- !ruby/object:Gem::Dependency
|
|
56
|
+
name: rspec
|
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
|
58
|
+
requirements:
|
|
59
|
+
- - "~>"
|
|
60
|
+
- !ruby/object:Gem::Version
|
|
61
|
+
version: '3.0'
|
|
62
|
+
type: :development
|
|
63
|
+
prerelease: false
|
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
65
|
+
requirements:
|
|
66
|
+
- - "~>"
|
|
67
|
+
- !ruby/object:Gem::Version
|
|
68
|
+
version: '3.0'
|
|
69
|
+
- !ruby/object:Gem::Dependency
|
|
70
|
+
name: rubocop
|
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
|
72
|
+
requirements:
|
|
73
|
+
- - "~>"
|
|
74
|
+
- !ruby/object:Gem::Version
|
|
75
|
+
version: '1.0'
|
|
76
|
+
type: :development
|
|
77
|
+
prerelease: false
|
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
79
|
+
requirements:
|
|
80
|
+
- - "~>"
|
|
81
|
+
- !ruby/object:Gem::Version
|
|
82
|
+
version: '1.0'
|
|
83
|
+
- !ruby/object:Gem::Dependency
|
|
84
|
+
name: parslet
|
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
|
86
|
+
requirements:
|
|
87
|
+
- - "~>"
|
|
88
|
+
- !ruby/object:Gem::Version
|
|
89
|
+
version: 2.0.0
|
|
90
|
+
type: :development
|
|
91
|
+
prerelease: false
|
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
93
|
+
requirements:
|
|
94
|
+
- - "~>"
|
|
95
|
+
- !ruby/object:Gem::Version
|
|
96
|
+
version: 2.0.0
|
|
97
|
+
- !ruby/object:Gem::Dependency
|
|
98
|
+
name: benchmark-ips
|
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
|
100
|
+
requirements:
|
|
101
|
+
- - "~>"
|
|
102
|
+
- !ruby/object:Gem::Version
|
|
103
|
+
version: '2.0'
|
|
104
|
+
type: :development
|
|
105
|
+
prerelease: false
|
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
107
|
+
requirements:
|
|
108
|
+
- - "~>"
|
|
109
|
+
- !ruby/object:Gem::Version
|
|
110
|
+
version: '2.0'
|
|
111
|
+
- !ruby/object:Gem::Dependency
|
|
112
|
+
name: rbs
|
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
|
114
|
+
requirements:
|
|
115
|
+
- - "~>"
|
|
116
|
+
- !ruby/object:Gem::Version
|
|
117
|
+
version: '3.0'
|
|
118
|
+
type: :development
|
|
119
|
+
prerelease: false
|
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
121
|
+
requirements:
|
|
122
|
+
- - "~>"
|
|
123
|
+
- !ruby/object:Gem::Version
|
|
124
|
+
version: '3.0'
|
|
125
|
+
- !ruby/object:Gem::Dependency
|
|
126
|
+
name: steep
|
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
|
128
|
+
requirements:
|
|
129
|
+
- - "~>"
|
|
130
|
+
- !ruby/object:Gem::Version
|
|
131
|
+
version: '1.0'
|
|
132
|
+
type: :development
|
|
133
|
+
prerelease: false
|
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
135
|
+
requirements:
|
|
136
|
+
- - "~>"
|
|
137
|
+
- !ruby/object:Gem::Version
|
|
138
|
+
version: '1.0'
|
|
139
|
+
description: A small Ruby library for constructing parsers in the PEG (Parsing Expression
|
|
140
|
+
Grammar) fashion. Parsanol provides Parslet-compatible API with additional features
|
|
141
|
+
including static frozen parsers and dynamic parsers, with optional Rust native extension
|
|
142
|
+
for improved performance.
|
|
143
|
+
email:
|
|
144
|
+
- open.source@ribose.com
|
|
145
|
+
executables: []
|
|
146
|
+
extensions: []
|
|
147
|
+
extra_rdoc_files: []
|
|
148
|
+
files:
|
|
149
|
+
- HISTORY.txt
|
|
150
|
+
- LICENSE
|
|
151
|
+
- README.adoc
|
|
152
|
+
- Rakefile
|
|
153
|
+
- lib/parsanol.rb
|
|
154
|
+
- lib/parsanol/3.2/parsanol_native.so
|
|
155
|
+
- lib/parsanol/3.3/parsanol_native.so
|
|
156
|
+
- lib/parsanol/3.4/parsanol_native.so
|
|
157
|
+
- lib/parsanol/4.0/parsanol_native.so
|
|
158
|
+
- lib/parsanol/ast_visitor.rb
|
|
159
|
+
- lib/parsanol/atoms.rb
|
|
160
|
+
- lib/parsanol/atoms/alternative.rb
|
|
161
|
+
- lib/parsanol/atoms/base.rb
|
|
162
|
+
- lib/parsanol/atoms/can_flatten.rb
|
|
163
|
+
- lib/parsanol/atoms/capture.rb
|
|
164
|
+
- lib/parsanol/atoms/context.rb
|
|
165
|
+
- lib/parsanol/atoms/context_optimized.rb
|
|
166
|
+
- lib/parsanol/atoms/custom.rb
|
|
167
|
+
- lib/parsanol/atoms/cut.rb
|
|
168
|
+
- lib/parsanol/atoms/dsl.rb
|
|
169
|
+
- lib/parsanol/atoms/dynamic.rb
|
|
170
|
+
- lib/parsanol/atoms/entity.rb
|
|
171
|
+
- lib/parsanol/atoms/ignored.rb
|
|
172
|
+
- lib/parsanol/atoms/infix.rb
|
|
173
|
+
- lib/parsanol/atoms/lookahead.rb
|
|
174
|
+
- lib/parsanol/atoms/named.rb
|
|
175
|
+
- lib/parsanol/atoms/re.rb
|
|
176
|
+
- lib/parsanol/atoms/repetition.rb
|
|
177
|
+
- lib/parsanol/atoms/scope.rb
|
|
178
|
+
- lib/parsanol/atoms/sequence.rb
|
|
179
|
+
- lib/parsanol/atoms/str.rb
|
|
180
|
+
- lib/parsanol/atoms/visitor.rb
|
|
181
|
+
- lib/parsanol/buffer.rb
|
|
182
|
+
- lib/parsanol/builder_callbacks.rb
|
|
183
|
+
- lib/parsanol/cause.rb
|
|
184
|
+
- lib/parsanol/context.rb
|
|
185
|
+
- lib/parsanol/convenience.rb
|
|
186
|
+
- lib/parsanol/edit_tracker.rb
|
|
187
|
+
- lib/parsanol/error_reporter.rb
|
|
188
|
+
- lib/parsanol/error_reporter/contextual.rb
|
|
189
|
+
- lib/parsanol/error_reporter/deepest.rb
|
|
190
|
+
- lib/parsanol/error_reporter/tree.rb
|
|
191
|
+
- lib/parsanol/expression.rb
|
|
192
|
+
- lib/parsanol/expression/treetop.rb
|
|
193
|
+
- lib/parsanol/fast_mode.rb
|
|
194
|
+
- lib/parsanol/first_set.rb
|
|
195
|
+
- lib/parsanol/grammar_builder.rb
|
|
196
|
+
- lib/parsanol/incremental_parser.rb
|
|
197
|
+
- lib/parsanol/interval_tree.rb
|
|
198
|
+
- lib/parsanol/lazy_result.rb
|
|
199
|
+
- lib/parsanol/mermaid.rb
|
|
200
|
+
- lib/parsanol/native.rb
|
|
201
|
+
- lib/parsanol/native/batch_decoder.rb
|
|
202
|
+
- lib/parsanol/native/dynamic.rb
|
|
203
|
+
- lib/parsanol/native/parser.rb
|
|
204
|
+
- lib/parsanol/native/serializer.rb
|
|
205
|
+
- lib/parsanol/native/transformer.rb
|
|
206
|
+
- lib/parsanol/native/types.rb
|
|
207
|
+
- lib/parsanol/optimizer.rb
|
|
208
|
+
- lib/parsanol/optimizers/choice_optimizer.rb
|
|
209
|
+
- lib/parsanol/optimizers/cut_inserter.rb
|
|
210
|
+
- lib/parsanol/optimizers/lookahead_optimizer.rb
|
|
211
|
+
- lib/parsanol/optimizers/quantifier_optimizer.rb
|
|
212
|
+
- lib/parsanol/optimizers/sequence_optimizer.rb
|
|
213
|
+
- lib/parsanol/options.rb
|
|
214
|
+
- lib/parsanol/options/zero_copy.rb
|
|
215
|
+
- lib/parsanol/parallel.rb
|
|
216
|
+
- lib/parsanol/parser.rb
|
|
217
|
+
- lib/parsanol/parslet.rb
|
|
218
|
+
- lib/parsanol/pattern.rb
|
|
219
|
+
- lib/parsanol/pattern/binding.rb
|
|
220
|
+
- lib/parsanol/pool.rb
|
|
221
|
+
- lib/parsanol/pools/array_pool.rb
|
|
222
|
+
- lib/parsanol/pools/buffer_pool.rb
|
|
223
|
+
- lib/parsanol/pools/position_pool.rb
|
|
224
|
+
- lib/parsanol/pools/slice_pool.rb
|
|
225
|
+
- lib/parsanol/position.rb
|
|
226
|
+
- lib/parsanol/resettable.rb
|
|
227
|
+
- lib/parsanol/result.rb
|
|
228
|
+
- lib/parsanol/result_builder.rb
|
|
229
|
+
- lib/parsanol/result_stream.rb
|
|
230
|
+
- lib/parsanol/rig/rspec.rb
|
|
231
|
+
- lib/parsanol/rope.rb
|
|
232
|
+
- lib/parsanol/scope.rb
|
|
233
|
+
- lib/parsanol/slice.rb
|
|
234
|
+
- lib/parsanol/source.rb
|
|
235
|
+
- lib/parsanol/source/line_cache.rb
|
|
236
|
+
- lib/parsanol/source_location.rb
|
|
237
|
+
- lib/parsanol/streaming_parser.rb
|
|
238
|
+
- lib/parsanol/string_view.rb
|
|
239
|
+
- lib/parsanol/transform.rb
|
|
240
|
+
- lib/parsanol/version.rb
|
|
241
|
+
- lib/parsanol/wasm/README.md
|
|
242
|
+
- lib/parsanol/wasm/package.json
|
|
243
|
+
- lib/parsanol/wasm/parsanol.js
|
|
244
|
+
- lib/parsanol/wasm/parslet.d.ts
|
|
245
|
+
- lib/parsanol/wasm_parser.rb
|
|
246
|
+
- parsanol.gemspec
|
|
247
|
+
homepage: https://github.com/parsanol/parsanol-ruby
|
|
248
|
+
licenses:
|
|
249
|
+
- MIT
|
|
250
|
+
metadata:
|
|
251
|
+
bug_tracker_uri: https://github.com/parsanol/parsanol-ruby/issues
|
|
252
|
+
changelog_uri: https://github.com/parsanol/parsanol-ruby/blob/main/HISTORY.txt
|
|
253
|
+
documentation_uri: https://parsanol.github.io/parsanol-ruby/
|
|
254
|
+
homepage_uri: https://github.com/parsanol/parsanol-ruby
|
|
255
|
+
source_code_uri: https://github.com/parsanol/parsanol-ruby
|
|
256
|
+
rubygems_mfa_required: 'true'
|
|
257
|
+
post_install_message:
|
|
258
|
+
rdoc_options: []
|
|
259
|
+
require_paths:
|
|
260
|
+
- lib
|
|
261
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
262
|
+
requirements:
|
|
263
|
+
- - ">="
|
|
264
|
+
- !ruby/object:Gem::Version
|
|
265
|
+
version: '3.2'
|
|
266
|
+
- - "<"
|
|
267
|
+
- !ruby/object:Gem::Version
|
|
268
|
+
version: 4.1.dev
|
|
269
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
270
|
+
requirements:
|
|
271
|
+
- - ">="
|
|
272
|
+
- !ruby/object:Gem::Version
|
|
273
|
+
version: '0'
|
|
274
|
+
requirements: []
|
|
275
|
+
rubygems_version: 3.5.23
|
|
276
|
+
signing_key:
|
|
277
|
+
specification_version: 4
|
|
278
|
+
summary: Parser construction library with great error reporting in Ruby.
|
|
279
|
+
test_files: []
|