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.
Files changed (100) hide show
  1. checksums.yaml +7 -0
  2. data/HISTORY.txt +98 -0
  3. data/LICENSE +23 -0
  4. data/README.adoc +905 -0
  5. data/Rakefile +141 -0
  6. data/lib/parsanol/3.2/parsanol_native.so +0 -0
  7. data/lib/parsanol/3.3/parsanol_native.so +0 -0
  8. data/lib/parsanol/3.4/parsanol_native.so +0 -0
  9. data/lib/parsanol/4.0/parsanol_native.so +0 -0
  10. data/lib/parsanol/ast_visitor.rb +122 -0
  11. data/lib/parsanol/atoms/alternative.rb +123 -0
  12. data/lib/parsanol/atoms/base.rb +208 -0
  13. data/lib/parsanol/atoms/can_flatten.rb +194 -0
  14. data/lib/parsanol/atoms/capture.rb +38 -0
  15. data/lib/parsanol/atoms/context.rb +357 -0
  16. data/lib/parsanol/atoms/context_optimized.rb +38 -0
  17. data/lib/parsanol/atoms/custom.rb +110 -0
  18. data/lib/parsanol/atoms/cut.rb +66 -0
  19. data/lib/parsanol/atoms/dsl.rb +96 -0
  20. data/lib/parsanol/atoms/dynamic.rb +39 -0
  21. data/lib/parsanol/atoms/entity.rb +75 -0
  22. data/lib/parsanol/atoms/ignored.rb +37 -0
  23. data/lib/parsanol/atoms/infix.rb +167 -0
  24. data/lib/parsanol/atoms/lookahead.rb +85 -0
  25. data/lib/parsanol/atoms/named.rb +74 -0
  26. data/lib/parsanol/atoms/re.rb +83 -0
  27. data/lib/parsanol/atoms/repetition.rb +277 -0
  28. data/lib/parsanol/atoms/scope.rb +35 -0
  29. data/lib/parsanol/atoms/sequence.rb +195 -0
  30. data/lib/parsanol/atoms/str.rb +109 -0
  31. data/lib/parsanol/atoms/visitor.rb +91 -0
  32. data/lib/parsanol/atoms.rb +46 -0
  33. data/lib/parsanol/buffer.rb +133 -0
  34. data/lib/parsanol/builder_callbacks.rb +353 -0
  35. data/lib/parsanol/cause.rb +122 -0
  36. data/lib/parsanol/context.rb +39 -0
  37. data/lib/parsanol/convenience.rb +36 -0
  38. data/lib/parsanol/edit_tracker.rb +111 -0
  39. data/lib/parsanol/error_reporter/contextual.rb +99 -0
  40. data/lib/parsanol/error_reporter/deepest.rb +120 -0
  41. data/lib/parsanol/error_reporter/tree.rb +63 -0
  42. data/lib/parsanol/error_reporter.rb +100 -0
  43. data/lib/parsanol/expression/treetop.rb +154 -0
  44. data/lib/parsanol/expression.rb +106 -0
  45. data/lib/parsanol/fast_mode.rb +187 -0
  46. data/lib/parsanol/first_set.rb +79 -0
  47. data/lib/parsanol/grammar_builder.rb +179 -0
  48. data/lib/parsanol/incremental_parser.rb +182 -0
  49. data/lib/parsanol/interval_tree.rb +226 -0
  50. data/lib/parsanol/lazy_result.rb +179 -0
  51. data/lib/parsanol/mermaid.rb +142 -0
  52. data/lib/parsanol/native/batch_decoder.rb +255 -0
  53. data/lib/parsanol/native/dynamic.rb +238 -0
  54. data/lib/parsanol/native/parser.rb +102 -0
  55. data/lib/parsanol/native/serializer.rb +252 -0
  56. data/lib/parsanol/native/transformer.rb +604 -0
  57. data/lib/parsanol/native/types.rb +29 -0
  58. data/lib/parsanol/native.rb +223 -0
  59. data/lib/parsanol/optimizer.rb +85 -0
  60. data/lib/parsanol/optimizers/choice_optimizer.rb +78 -0
  61. data/lib/parsanol/optimizers/cut_inserter.rb +182 -0
  62. data/lib/parsanol/optimizers/lookahead_optimizer.rb +56 -0
  63. data/lib/parsanol/optimizers/quantifier_optimizer.rb +60 -0
  64. data/lib/parsanol/optimizers/sequence_optimizer.rb +97 -0
  65. data/lib/parsanol/options/zero_copy.rb +127 -0
  66. data/lib/parsanol/options.rb +21 -0
  67. data/lib/parsanol/parallel.rb +128 -0
  68. data/lib/parsanol/parser.rb +242 -0
  69. data/lib/parsanol/parslet.rb +151 -0
  70. data/lib/parsanol/pattern/binding.rb +91 -0
  71. data/lib/parsanol/pattern.rb +162 -0
  72. data/lib/parsanol/pool.rb +219 -0
  73. data/lib/parsanol/pools/array_pool.rb +75 -0
  74. data/lib/parsanol/pools/buffer_pool.rb +182 -0
  75. data/lib/parsanol/pools/position_pool.rb +92 -0
  76. data/lib/parsanol/pools/slice_pool.rb +64 -0
  77. data/lib/parsanol/position.rb +94 -0
  78. data/lib/parsanol/resettable.rb +29 -0
  79. data/lib/parsanol/result.rb +46 -0
  80. data/lib/parsanol/result_builder.rb +208 -0
  81. data/lib/parsanol/result_stream.rb +266 -0
  82. data/lib/parsanol/rig/rspec.rb +71 -0
  83. data/lib/parsanol/rope.rb +81 -0
  84. data/lib/parsanol/scope.rb +104 -0
  85. data/lib/parsanol/slice.rb +160 -0
  86. data/lib/parsanol/source/line_cache.rb +102 -0
  87. data/lib/parsanol/source.rb +185 -0
  88. data/lib/parsanol/source_location.rb +167 -0
  89. data/lib/parsanol/streaming_parser.rb +124 -0
  90. data/lib/parsanol/string_view.rb +198 -0
  91. data/lib/parsanol/transform.rb +226 -0
  92. data/lib/parsanol/version.rb +5 -0
  93. data/lib/parsanol/wasm/README.md +80 -0
  94. data/lib/parsanol/wasm/package.json +51 -0
  95. data/lib/parsanol/wasm/parsanol.js +252 -0
  96. data/lib/parsanol/wasm/parslet.d.ts +129 -0
  97. data/lib/parsanol/wasm_parser.rb +240 -0
  98. data/lib/parsanol.rb +278 -0
  99. data/parsanol.gemspec +67 -0
  100. 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: []