pestle 0.1.0

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 (75) hide show
  1. checksums.yaml +7 -0
  2. checksums.yaml.gz.sig +0 -0
  3. data/.rubocop.yml +59 -0
  4. data/.ruby-version +1 -0
  5. data/CHANGELOG.md +3 -0
  6. data/LICENSE.txt +21 -0
  7. data/LICENSE_PEST.txt +23 -0
  8. data/README.md +124 -0
  9. data/Rakefile +23 -0
  10. data/Steepfile +19 -0
  11. data/benchmarks/jsonpath_ips.rb +33 -0
  12. data/examples/calculator_pratt.rb +157 -0
  13. data/examples/calculator_prec_climber.rb +225 -0
  14. data/examples/calculator_stack_vm.rb +291 -0
  15. data/examples/csv.rb +73 -0
  16. data/examples/ini.rb +90 -0
  17. data/examples/json_example.rb +141 -0
  18. data/examples/jsonpath/README.md +3 -0
  19. data/examples/jsonpath/jsonpath.pest +182 -0
  20. data/examples/jsonpath/lib/jsonpath/ast.rb +362 -0
  21. data/examples/jsonpath/lib/jsonpath/function_extensions.rb +201 -0
  22. data/examples/jsonpath/lib/jsonpath/node.rb +20 -0
  23. data/examples/jsonpath/lib/jsonpath/query.rb +25 -0
  24. data/examples/jsonpath/lib/jsonpath.rb +453 -0
  25. data/lib/pestle/errors.rb +98 -0
  26. data/lib/pestle/grammar/builtin_rules/ascii.rb +38 -0
  27. data/lib/pestle/grammar/builtin_rules/special.rb +63 -0
  28. data/lib/pestle/grammar/builtin_rules/unicode.rb +291 -0
  29. data/lib/pestle/grammar/errors.rb +62 -0
  30. data/lib/pestle/grammar/expression.rb +90 -0
  31. data/lib/pestle/grammar/expressions/choice.rb +36 -0
  32. data/lib/pestle/grammar/expressions/group.rb +27 -0
  33. data/lib/pestle/grammar/expressions/identifier.rb +26 -0
  34. data/lib/pestle/grammar/expressions/postfix.rb +272 -0
  35. data/lib/pestle/grammar/expressions/prefix.rb +51 -0
  36. data/lib/pestle/grammar/expressions/range.rb +26 -0
  37. data/lib/pestle/grammar/expressions/sequence.rb +38 -0
  38. data/lib/pestle/grammar/expressions/stack.rb +192 -0
  39. data/lib/pestle/grammar/expressions/string.rb +46 -0
  40. data/lib/pestle/grammar/lexer.rb +464 -0
  41. data/lib/pestle/grammar/parser.rb +340 -0
  42. data/lib/pestle/grammar/rule.rb +98 -0
  43. data/lib/pestle/pair.rb +325 -0
  44. data/lib/pestle/parser.rb +48 -0
  45. data/lib/pestle/pratt.rb +74 -0
  46. data/lib/pestle/state.rb +220 -0
  47. data/lib/pestle/version.rb +5 -0
  48. data/lib/pestle.rb +24 -0
  49. data/sig/errors.rbs +22 -0
  50. data/sig/grammar/ascii.rbs +9 -0
  51. data/sig/grammar/choice.rbs +14 -0
  52. data/sig/grammar/errors.rbs +22 -0
  53. data/sig/grammar/expression.rbs +39 -0
  54. data/sig/grammar/group.rbs +14 -0
  55. data/sig/grammar/identifier.rbs +11 -0
  56. data/sig/grammar/lexer.rbs +85 -0
  57. data/sig/grammar/parser.rbs +57 -0
  58. data/sig/grammar/postfix.rbs +112 -0
  59. data/sig/grammar/prefix.rbs +27 -0
  60. data/sig/grammar/range.rbs +20 -0
  61. data/sig/grammar/rule.rbs +40 -0
  62. data/sig/grammar/sequence.rbs +14 -0
  63. data/sig/grammar/special.rbs +39 -0
  64. data/sig/grammar/stack.rbs +57 -0
  65. data/sig/grammar/string.rbs +27 -0
  66. data/sig/grammar/unicode.rbs +15 -0
  67. data/sig/pair.rbs +168 -0
  68. data/sig/parser.rbs +16 -0
  69. data/sig/pestle.rbs +5 -0
  70. data/sig/pratt.rbs +27 -0
  71. data/sig/state.rbs +95 -0
  72. data/sig/stdlib/strscan.rbs +3 -0
  73. data.tar.gz.sig +0 -0
  74. metadata +141 -0
  75. metadata.gz.sig +0 -0
data/sig/pair.rbs ADDED
@@ -0,0 +1,168 @@
1
+ module Pestle
2
+ class Token
3
+ @rule: Symbol
4
+
5
+ @pos: Integer
6
+
7
+ attr_reader rule: Symbol
8
+
9
+ attr_reader pos: Integer
10
+
11
+ def initialize: (Symbol rule, Integer pos) -> void
12
+ end
13
+
14
+ class Start < Token
15
+ def to_s: () -> ::String
16
+ end
17
+
18
+ class End < Token
19
+ def to_s: () -> ::String
20
+ end
21
+
22
+ class Span
23
+ @text: String
24
+
25
+ @start: Integer
26
+
27
+ @end: Integer
28
+
29
+ attr_reader text: String
30
+
31
+ attr_reader start: Integer
32
+
33
+ attr_reader end: Integer
34
+
35
+ def initialize: (String text, Integer start, Integer stop) -> void
36
+
37
+ def to_s: () -> String
38
+
39
+ def start_pos: () -> Position
40
+
41
+ def end_pos: () -> Position
42
+
43
+ # Return an array of lines covered by this span.
44
+ def lines: () -> Array[String]
45
+ end
46
+
47
+ class Position
48
+ @text: String
49
+
50
+ @pos: Integer
51
+
52
+ attr_reader text: String
53
+
54
+ attr_reader pos: Integer
55
+
56
+ def initialize: (String text, Integer pos) -> void
57
+
58
+ def line_col: () -> [Integer, Integer]
59
+
60
+ def line_of: () -> String
61
+ end
62
+
63
+ class Pair
64
+ @source: String
65
+
66
+ @start: Integer
67
+
68
+ @end: Integer
69
+
70
+ @rule: Symbol
71
+
72
+ @children: Array[Pair]
73
+
74
+ @tag: String?
75
+
76
+ @name: String
77
+
78
+ attr_reader start: Integer
79
+
80
+ attr_reader end: Integer
81
+
82
+ attr_reader rule: Symbol
83
+
84
+ attr_reader tag: String?
85
+
86
+ attr_reader name: String
87
+
88
+ attr_reader children: Array[Pair]
89
+
90
+ def initialize: (String source, Integer start, Integer stop, String rule_name, Array[Pair] children, ?tag: untyped?) -> void
91
+
92
+ def deconstruct: () -> Array[untyped]
93
+
94
+ def deconstruct_keys: (untyped keys) -> Hash[Symbol, untyped]
95
+
96
+ def to_s: () -> String
97
+
98
+ def each: () ?{ (?) -> untyped } -> untyped
99
+
100
+ def to_ary: () -> Array[Pair]
101
+
102
+ def inner: () -> Pairs
103
+
104
+ def stream: () -> Stream
105
+
106
+ def tokens: () -> Enumerable[Token]
107
+
108
+ def span: () -> Span
109
+
110
+ def dump: () -> Hash[String, untyped]
111
+
112
+ def dumps: (?indent: ::Integer, ?new_line: bool) -> String
113
+
114
+ def line_col: () -> [Integer, Integer]
115
+
116
+ def text: () -> String
117
+
118
+ def inner_texts: () -> Array[String]
119
+ end
120
+
121
+ class Pairs
122
+ @pairs: Array[Pair]
123
+
124
+ def initialize: (Array[Pair] pairs) -> void
125
+
126
+ def each: () ?{ (?) -> untyped } -> untyped
127
+
128
+ def length: () -> Integer
129
+
130
+ def tokens: () -> Enumerable[Token]
131
+
132
+ def stream: () -> Stream
133
+
134
+ def dump: () -> Array[untyped]
135
+
136
+ def dumps: (?compact: bool) -> String
137
+
138
+ def flatten: () -> Enumerable[Pair]
139
+
140
+ def first: () -> Pair?
141
+
142
+ def pop: () -> Pair?
143
+
144
+ def find_first_tagged: (String label) -> (Pair | nil)
145
+
146
+ def find_tagged: (String label) -> Enumerable[Pair]
147
+ end
148
+
149
+ # Step through pairs of tokens.
150
+ class Stream
151
+ @pairs: Array[Pair]
152
+
153
+ @pos: Integer
154
+
155
+ attr_accessor pos: Integer
156
+
157
+ def initialize: (Array[Pair] pairs) -> void
158
+
159
+ # Consume and return the next pair, or nil if we're at the end of the stream.
160
+ def next: () -> Pair?
161
+
162
+ # Go back one position. This is a no-op if we're at the beginning of the stream.
163
+ def backup: () -> void
164
+
165
+ # Return the next pair without consuming it, or nil if we're at the end of the stream.
166
+ def peek: () -> Pair?
167
+ end
168
+ end
data/sig/parser.rbs ADDED
@@ -0,0 +1,16 @@
1
+ module Pestle
2
+ class Parser
3
+ @rules: Hash[String, Pestle::Grammar::Rule]
4
+
5
+ @doc: String?
6
+
7
+ # Parse a grammar definition and return a new parser for it.
8
+ def self.from_grammar: (String grammar) -> Parser
9
+
10
+ def initialize: (Hash[String, Pestle::Grammar::Rule] rules, String? doc) -> void
11
+
12
+ def parse: (String | Symbol start_rule, String text, ?start_pos: ::Integer) -> Pairs
13
+
14
+ def tree_view: () -> String
15
+ end
16
+ end
data/sig/pestle.rbs ADDED
@@ -0,0 +1,5 @@
1
+ module Pestle
2
+ VERSION: String
3
+
4
+ def self.parse_grammar: (String grammar) -> [Hash[String, Pestle::Grammar::Rule], String?]
5
+ end
data/sig/pratt.rbs ADDED
@@ -0,0 +1,27 @@
1
+ module Pestle
2
+ # A Generic Pratt parser base class operating on a Pestle::Stream of token pairs.
3
+ class PrattParser[ExprT]
4
+ # A mapping of prefix operator rule symbols to precedence levels.
5
+ PREFIX_OPS: ::Hash[Symbol, Integer]
6
+
7
+ # A mapping of infix operator rule symbols to [precedence, right_associative].
8
+ INFIX_OPS: ::Hash[Symbol, [Integer, bool]]
9
+
10
+ # A mapping of postfix operator rule symbols to precedence levels.
11
+ POSTFIX_OPS: ::Hash[Symbol, Integer]
12
+
13
+ LEFT_ASSOC: false
14
+
15
+ RIGHT_ASSOC: true
16
+
17
+ def parse_primary: (Pair pair) -> ExprT
18
+
19
+ def parse_prefix: (Pair op, ExprT rhs) -> ExprT
20
+
21
+ def parse_infix: (ExprT lhs, Pair op, ExprT rhs) -> ExprT
22
+
23
+ def parse_postfix: (ExprT lhs, Pair op) -> ExprT
24
+
25
+ def parse_expr: (Stream stream, ?::Integer min_prec) -> ExprT
26
+ end
27
+ end
data/sig/state.rbs ADDED
@@ -0,0 +1,95 @@
1
+ module Pestle
2
+ class ParserState
3
+ @text: String
4
+
5
+ @scanner: StringScanner
6
+
7
+ @rules: Hash[String, Pestle::Grammar::Rule]
8
+
9
+ @pos_checkpoints: Array[Integer]
10
+
11
+ @atomic_depth: Integer
12
+
13
+ @atomic_depth_checkpoints: Array[Integer]
14
+
15
+ @tags: Array[String]
16
+
17
+ @user_stack: Array[String]
18
+
19
+ @user_stack_popped: Array[String]
20
+
21
+ @user_stack_lengths: Array[[Integer, Integer]]
22
+
23
+ @rule_stack: Array[String]
24
+
25
+ @neg_pred_stack: Array[Integer]
26
+
27
+ @furthest_pos: Integer
28
+
29
+ @furthest_rules: Array[String]
30
+
31
+ @furthest_expected: Hash[String, Array[String]]
32
+
33
+ @furthest_unexpected: Hash[String, Array[String]]
34
+
35
+ attr_reader text: String
36
+
37
+ attr_reader scanner: StringScanner
38
+
39
+ attr_reader rules: Hash[String, Pestle::Grammar::Rule]
40
+
41
+ attr_reader tags: Array[String]
42
+
43
+ attr_reader atomic_depth: Integer
44
+
45
+ attr_reader user_stack: Array[String]
46
+
47
+ attr_reader rule_stack: Array[String]
48
+
49
+ attr_reader furthest_pos: Integer
50
+
51
+ attr_reader furthest_expected: Hash[String, Array[String]]
52
+
53
+ attr_reader furthest_unexpected: Hash[String, Array[String]]
54
+
55
+ attr_reader furthest_rules: Array[String]
56
+
57
+ attr_reader neg_pred_stack: Array[Integer]
58
+
59
+ def initialize: (String text, Hash[String, Pestle::Grammar::Rule] rules, ?start_pos: ::Integer) -> void
60
+
61
+ def checkpoint: () -> void
62
+
63
+ def ok: () -> void
64
+
65
+ def restore: () -> void
66
+
67
+ def stack_snapshot: () -> void
68
+
69
+ def stack_drop_snapshot: () -> void
70
+
71
+ def stack_restore: () -> void
72
+
73
+ def stack_empty?: () -> bool
74
+
75
+ def stack_push: (String value) -> void
76
+
77
+ def stack_pop: () -> String?
78
+
79
+ def stack_peek: () -> String?
80
+
81
+ def stack_peek_slice: (Integer? start, Integer? stop) -> Array[String]
82
+
83
+ def stack_clear: () -> void
84
+
85
+ def parse_trivia: (Array[Pestle::Pair] pairs) -> bool
86
+
87
+ def with_tag: (String name) { () -> untyped } -> untyped
88
+
89
+ def atomic: () { () -> untyped } -> untyped
90
+
91
+ def nonatomic: () { () -> untyped } -> untyped
92
+
93
+ def track: (String label, bool matched) -> void
94
+ end
95
+ end
@@ -0,0 +1,3 @@
1
+ class StringScanner
2
+ def scan_byte: () -> Integer?
3
+ end
data.tar.gz.sig ADDED
Binary file
metadata ADDED
@@ -0,0 +1,141 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: pestle
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - James Prior
8
+ bindir: bin
9
+ cert_chain:
10
+ - |
11
+ -----BEGIN CERTIFICATE-----
12
+ MIIEhTCCAu2gAwIBAgIBATANBgkqhkiG9w0BAQsFADBEMRYwFAYDVQQDDA1qYW1l
13
+ c2dyLnByaW9yMRUwEwYKCZImiZPyLGQBGRYFZ21haWwxEzARBgoJkiaJk/IsZAEZ
14
+ FgNjb20wHhcNMjUxMDI1MDc0ODI4WhcNMjYxMDI1MDc0ODI4WjBEMRYwFAYDVQQD
15
+ DA1qYW1lc2dyLnByaW9yMRUwEwYKCZImiZPyLGQBGRYFZ21haWwxEzARBgoJkiaJ
16
+ k/IsZAEZFgNjb20wggGiMA0GCSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQDYTvQW
17
+ 0JzsHenYu4w0iHgJRtU9uK8vkDx1wlMioKlPFkaiMfxqUcTTfg80U/n8n/KKmpdq
18
+ y2rpUqv+VPE2nrfCUncf7ukqs+gF8uehbciMXV4iOzsZmqmtlPUJiGuSyO8REe/O
19
+ ERAyxYV8y5psF+WnW4uQzsWCKTnKbexIc6rf237veuYvYoBpnodJu0mJ0m9tBCFU
20
+ qH3Nk1sHBRIEEwn+nTiIiOMb+QMU5p0NIQkIhJO3el5nEQgIGxMPnie7PnwxPquQ
21
+ 1rouuISbLmQy5oKYc9kScwnHdAu2PtnnJFNNuQ37vED375iQgMem/tK8EgMm9/Qr
22
+ Qxd2DQqqehgtEySWntGHTxNLXQouqHIRyqzkbcCatJqC+PBBql1x2N1KqgyvbLM3
23
+ B0dZCdJECr5J8zrluMxYsy7uGMmLz3LZ7PskGaJg4XxXP3j/B/e03/AxDj0neZZu
24
+ xuDLIfMDSNILO1pskMc+Xp0xdnkbS4IjiMDTrhqABuEcdNYH/GpyTiA/I0cCAwEA
25
+ AaOBgTB/MAkGA1UdEwQCMAAwCwYDVR0PBAQDAgSwMB0GA1UdDgQWBBR4j7UhnpT9
26
+ mLcAkshwkFtwVpMdejAiBgNVHREEGzAZgRdqYW1lc2dyLnByaW9yQGdtYWlsLmNv
27
+ bTAiBgNVHRIEGzAZgRdqYW1lc2dyLnByaW9yQGdtYWlsLmNvbTANBgkqhkiG9w0B
28
+ AQsFAAOCAYEAbTkg946BsGPQFX3jskBjwINeFnMP0IppuStonPQv3SNQu1SWP0xS
29
+ o1Qji1dxkWDfOcp1ffrRMUo7ecrJbTqQ5Sdx+7zw0OLodSVqSu1LMIVDw/T73smg
30
+ ADO2r3eZ8vxCKh7z4wUeKXvmBXi5NvpmvhH7D+qeG4OMLI8jnfmfbSHZQZbe2tpd
31
+ tJC+MYVok/m91fBrfv5wqLsR5QiJl3vcVhG+xACd46gr3JZFOxBqpSJrCYL8Gwqx
32
+ BaKEySCLGqkb0d1Rnt2/zTR2KtW2QJVH9rBMnJ+LsPEFKs1UHH4qHzxmwmmaQLon
33
+ MoE4UJ51GHGrjJ4WsHOUSOy5UbjaQec3kuIDwTXKbHws0J0Ut9S4S38opZKdQHDD
34
+ PUBpY0QA1CgE/VjKAYEDHOJyfUCNOl+sEESM+WxEXZAUVZLrFF7MljJqyQq+JyTD
35
+ vFKHe1ZAA76NFrPscB/ODPTBK8i+u4gwrD1UAsVAHuIbOpQu4LYAujluCu5cl2A8
36
+ HhmlCT7sTkqG
37
+ -----END CERTIFICATE-----
38
+ date: 1980-01-02 00:00:00.000000000 Z
39
+ dependencies: []
40
+ email:
41
+ - jamesgr.prior@gmail.com
42
+ executables: []
43
+ extensions: []
44
+ extra_rdoc_files: []
45
+ files:
46
+ - ".rubocop.yml"
47
+ - ".ruby-version"
48
+ - CHANGELOG.md
49
+ - LICENSE.txt
50
+ - LICENSE_PEST.txt
51
+ - README.md
52
+ - Rakefile
53
+ - Steepfile
54
+ - benchmarks/jsonpath_ips.rb
55
+ - examples/calculator_pratt.rb
56
+ - examples/calculator_prec_climber.rb
57
+ - examples/calculator_stack_vm.rb
58
+ - examples/csv.rb
59
+ - examples/ini.rb
60
+ - examples/json_example.rb
61
+ - examples/jsonpath/README.md
62
+ - examples/jsonpath/jsonpath.pest
63
+ - examples/jsonpath/lib/jsonpath.rb
64
+ - examples/jsonpath/lib/jsonpath/ast.rb
65
+ - examples/jsonpath/lib/jsonpath/function_extensions.rb
66
+ - examples/jsonpath/lib/jsonpath/node.rb
67
+ - examples/jsonpath/lib/jsonpath/query.rb
68
+ - lib/pestle.rb
69
+ - lib/pestle/errors.rb
70
+ - lib/pestle/grammar/builtin_rules/ascii.rb
71
+ - lib/pestle/grammar/builtin_rules/special.rb
72
+ - lib/pestle/grammar/builtin_rules/unicode.rb
73
+ - lib/pestle/grammar/errors.rb
74
+ - lib/pestle/grammar/expression.rb
75
+ - lib/pestle/grammar/expressions/choice.rb
76
+ - lib/pestle/grammar/expressions/group.rb
77
+ - lib/pestle/grammar/expressions/identifier.rb
78
+ - lib/pestle/grammar/expressions/postfix.rb
79
+ - lib/pestle/grammar/expressions/prefix.rb
80
+ - lib/pestle/grammar/expressions/range.rb
81
+ - lib/pestle/grammar/expressions/sequence.rb
82
+ - lib/pestle/grammar/expressions/stack.rb
83
+ - lib/pestle/grammar/expressions/string.rb
84
+ - lib/pestle/grammar/lexer.rb
85
+ - lib/pestle/grammar/parser.rb
86
+ - lib/pestle/grammar/rule.rb
87
+ - lib/pestle/pair.rb
88
+ - lib/pestle/parser.rb
89
+ - lib/pestle/pratt.rb
90
+ - lib/pestle/state.rb
91
+ - lib/pestle/version.rb
92
+ - sig/errors.rbs
93
+ - sig/grammar/ascii.rbs
94
+ - sig/grammar/choice.rbs
95
+ - sig/grammar/errors.rbs
96
+ - sig/grammar/expression.rbs
97
+ - sig/grammar/group.rbs
98
+ - sig/grammar/identifier.rbs
99
+ - sig/grammar/lexer.rbs
100
+ - sig/grammar/parser.rbs
101
+ - sig/grammar/postfix.rbs
102
+ - sig/grammar/prefix.rbs
103
+ - sig/grammar/range.rbs
104
+ - sig/grammar/rule.rbs
105
+ - sig/grammar/sequence.rbs
106
+ - sig/grammar/special.rbs
107
+ - sig/grammar/stack.rbs
108
+ - sig/grammar/string.rbs
109
+ - sig/grammar/unicode.rbs
110
+ - sig/pair.rbs
111
+ - sig/parser.rbs
112
+ - sig/pestle.rbs
113
+ - sig/pratt.rbs
114
+ - sig/state.rbs
115
+ - sig/stdlib/strscan.rbs
116
+ homepage: https://github.com/jg-rp/ruby-pestle
117
+ licenses:
118
+ - MIT
119
+ metadata:
120
+ homepage_uri: https://github.com/jg-rp/ruby-pestle
121
+ source_code_uri: https://github.com/jg-rp/ruby-pestle
122
+ changelog_uri: https://github.com/jg-rp/ruby-pestle/blob/main/CHANGELOG.md
123
+ rubygems_mfa_required: 'true'
124
+ rdoc_options: []
125
+ require_paths:
126
+ - lib
127
+ required_ruby_version: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: 3.3.0
132
+ required_rubygems_version: !ruby/object:Gem::Requirement
133
+ requirements:
134
+ - - ">="
135
+ - !ruby/object:Gem::Version
136
+ version: '0'
137
+ requirements: []
138
+ rubygems_version: 3.6.9
139
+ specification_version: 4
140
+ summary: A general purpose parser for Ruby.
141
+ test_files: []
metadata.gz.sig ADDED
Binary file