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
@@ -0,0 +1,9 @@
1
+ module Pestle::Grammar
2
+ class ASCIIRule < BuiltInRule
3
+ def initialize: (String name, *Array[String] ranges) -> void
4
+ end
5
+
6
+ ASCII_RULE_DEFS: Hash[String, Array[Array[String]]]
7
+
8
+ ASCII_RULES: Hash[String, BuiltInRule]
9
+ end
@@ -0,0 +1,14 @@
1
+ module Pestle::Grammar
2
+ # The choice operator `|`.
3
+ class Choice < Expression
4
+ @expressions: Array[Expression]
5
+
6
+ attr_reader expressions: Array[Expression]
7
+
8
+ def initialize: (*Expression expressions) -> void
9
+
10
+ def parse: (Pestle::ParserState state, Array[Pestle::Pair] pairs) -> bool
11
+
12
+ def children: () -> Array[Expression]
13
+ end
14
+ end
@@ -0,0 +1,22 @@
1
+ module Pestle::Grammar
2
+ # Pest grammar parsing error.
3
+ class PestGrammarError < StandardError
4
+ @token: [Symbol, String?, Integer]
5
+
6
+ @source: String
7
+
8
+ attr_accessor token: [Symbol, String?, Integer]
9
+
10
+ attr_accessor source: String
11
+
12
+ FULL_MESSAGE: bool
13
+
14
+ def initialize: (String message, String source, [Symbol, String?, Integer] token) -> void
15
+
16
+ def detailed_message: (?highlight: bool, **untyped kwargs) -> String
17
+
18
+ def full_message: (?highlight: bool, ?order: ::Symbol) -> String
19
+
20
+ def error_context: (String source, Integer index) -> [Integer, Integer, String]
21
+ end
22
+ end
@@ -0,0 +1,39 @@
1
+ module Pestle::Grammar
2
+ # Base class for all grammar expressions.
3
+ class Expression
4
+ @tag: String?
5
+
6
+ attr_reader tag: String?
7
+
8
+ def initialize: (?tag: String?) -> void
9
+
10
+ def parse: (Pestle::ParserState state, Array[Pestle::Pair] pairs) -> bool
11
+
12
+ def children: () -> Array[Expression]
13
+
14
+ def tag_s: () -> String?
15
+
16
+ def tree_view: () -> String
17
+ end
18
+
19
+ # Base class for terminal expressions (those without children).
20
+ class Terminal < Expression
21
+ def children: () -> ::Array[Expression]
22
+ end
23
+
24
+ class RegexExpression < Terminal
25
+ @pattern: String
26
+
27
+ @re: Regexp
28
+
29
+ attr_reader pattern: String
30
+
31
+ attr_reader re: Regexp
32
+
33
+ def initialize: (String pattern, Regexp re) -> void
34
+
35
+ def to_s: () -> ::String
36
+
37
+ def parse: (Pestle::ParserState state, Array[Pestle::Pair] pairs) -> bool
38
+ end
39
+ end
@@ -0,0 +1,14 @@
1
+ module Pestle::Grammar
2
+ # An expression surrounded by parentheses.
3
+ class Group < Expression
4
+ @expression: Expression
5
+
6
+ attr_reader expression: Expression
7
+
8
+ def initialize: (Expression expression, ?tag: String?) -> void
9
+
10
+ def parse: (Pestle::ParserState state, Array[Pestle::Pair] pairs) -> bool
11
+
12
+ def children: () -> ::Array[Expression]
13
+ end
14
+ end
@@ -0,0 +1,11 @@
1
+ module Pestle::Grammar
2
+ class Identifier < Terminal
3
+ @value: String
4
+
5
+ attr_reader value: String
6
+
7
+ def initialize: (String value, ?tag: String?) -> void
8
+
9
+ def parse: (Pestle::ParserState state, Array[Pestle::Pair] pairs) -> bool
10
+ end
11
+ end
@@ -0,0 +1,85 @@
1
+ module Pestle::Grammar
2
+ # Pest grammar tokenizer.
3
+ class Lexer
4
+ @grammar: String
5
+
6
+ @scanner: StringScanner
7
+
8
+ # Start of the current token as a byte index into grammar.
9
+ @start: Integer
10
+
11
+ # Tokens are arrays of (kind, value, start index).
12
+ # Sometimes we set value to `nil` when the symbol is unambiguous.
13
+ @tokens: Array[[Symbol, String?, Integer]]
14
+
15
+ attr_reader tokens: Array[[Symbol, String?, Integer]]
16
+
17
+ RE_WHITESPACE: ::Regexp
18
+
19
+ RE_LINE_COMMENT: ::Regexp
20
+
21
+ RE_BLOCK_COMMENT_START: ::Regexp
22
+
23
+ RE_BLOCK_COMMENT_END: ::Regexp
24
+
25
+ RE_BLOCK_COMMENT_CHUNK: ::Regexp
26
+
27
+ RE_GRAMMAR_DOC: ::Regexp
28
+
29
+ RE_RULE_DOC: ::Regexp
30
+
31
+ RE_IDENT: ::Regexp
32
+
33
+ RE_TAG: ::Regexp
34
+
35
+ RE_PUSH_LITERAL: ::Regexp
36
+
37
+ RE_PUSH: ::Regexp
38
+
39
+ RE_PEEK: ::Regexp
40
+
41
+ RE_PEEK_ALL: ::Regexp
42
+
43
+ RE_POP: ::Regexp
44
+
45
+ RE_POP_ALL: ::Regexp
46
+
47
+ RE_DROP: ::Regexp
48
+
49
+ RE_CHAR: ::Regexp
50
+
51
+ RE_INTEGER: ::Regexp
52
+
53
+ RE_RANGE_OP: ::Regexp
54
+
55
+ RE_NUMBER: ::Regexp
56
+
57
+ def self.tokenize: (String grammar) -> Array[[Symbol, String?, Integer]]
58
+
59
+ def initialize: (String grammar) -> void
60
+
61
+ def run: () -> void
62
+
63
+ def skip?: (Regexp regex) -> (true | false)
64
+
65
+ def skip_block_comment?: () -> (true | false)
66
+
67
+ def skip_trivia: () -> untyped
68
+
69
+ def lex_grammar: () -> void
70
+
71
+ def lex_rules: () -> void
72
+
73
+ def accept_expression: () -> void
74
+
75
+ def accept_term: () -> void
76
+
77
+ def accept_terminal?: () -> bool
78
+
79
+ def accept_postfix_op: () -> void
80
+
81
+ def accept_string_literal?: () -> bool
82
+
83
+ def accept_ci_string_literal?: () -> bool
84
+ end
85
+ end
@@ -0,0 +1,57 @@
1
+ module Pestle::Grammar
2
+ # Pest grammar parser.
3
+ class Parser
4
+ @source: String
5
+
6
+ @tokens: Array[[Symbol, String?, Integer]]
7
+
8
+ @pos: Integer
9
+
10
+ @eof: [Symbol, String?, Integer]
11
+
12
+ PREC_LOWEST: Integer
13
+ PREC_CHOICE: Integer
14
+ PREC_SEQUENCE: Integer
15
+ PREC_PREFIX: Integer
16
+
17
+ PRECEDENCES: Hash[Symbol, Integer]
18
+
19
+ INFIX_OPERATORS: Set[Symbol]
20
+
21
+ def initialize: (String source, Array[[Symbol, String?, Integer]] tokens) -> void
22
+
23
+ RE_SLASH_X: Regexp
24
+ RE_SLASH_U: Regexp
25
+
26
+ def unescape: (String value, [Symbol, String?, Integer] token) -> String
27
+
28
+ # Return the current token without advancing the pointer.
29
+ # An EOF token is returned if there are no tokens left.
30
+ def current: () -> [Symbol, String?, Integer]
31
+
32
+ # Consume and return the next token.
33
+ def next: () -> [Symbol, String?, Integer]
34
+
35
+ def peek: (?::Integer offset) -> [Symbol, String?, Integer]
36
+
37
+ # Consume the next token if its kind matches _kind_, raise an error if it does not.
38
+ def eat: (Symbol kind, ?String? message) -> [Symbol, String?, Integer]
39
+
40
+ def parse: () -> [Hash[String, Rule], String?]
41
+
42
+ def parse_rules: () -> Hash[String, Rule]
43
+
44
+ def parse_modifier: () -> Integer
45
+
46
+ def parse_expression: (Integer precedence) -> Expression
47
+
48
+ def parse_infix_expression: (Expression left) -> Expression
49
+
50
+ def parse_postfix_expression: (Expression expr) -> Expression
51
+
52
+ def parse_repeat_expression: (Expression expr) -> Expression
53
+
54
+ def parse_peek_expression: (String? tag) -> Expression
55
+
56
+ end
57
+ end
@@ -0,0 +1,112 @@
1
+ module Pestle::Grammar
2
+ # An optional expression `<expression>?`.
3
+ class Optional < Expression
4
+ @expression: Expression
5
+
6
+ attr_reader expression: Expression
7
+
8
+ def initialize: (Expression expression) -> void
9
+
10
+ def parse: (Pestle::ParserState state, Array[Pestle::Pair] pairs) -> bool
11
+
12
+ def children: () -> ::Array[Expression]
13
+ end
14
+
15
+ # An expression repeated zero or more times `<expression>*`.
16
+ class Repeat < Expression
17
+ @expression: Expression
18
+
19
+ attr_reader expression: Expression
20
+
21
+ def initialize: (Expression expression) -> void
22
+
23
+ def parse: (Pestle::ParserState state, Array[Pestle::Pair] pairs) -> bool
24
+
25
+ def children: () -> ::Array[Expression]
26
+ end
27
+
28
+ # An expression repeated one or more times `<expression>+`.
29
+ class RepeatOnce < Expression
30
+ @expression: Expression
31
+
32
+ attr_reader expression: Expression
33
+
34
+ def initialize: (Expression expression) -> void
35
+
36
+ def parse: (Pestle::ParserState state, Array[Pestle::Pair] pairs) -> bool
37
+
38
+ def children: () -> ::Array[Expression]
39
+ end
40
+
41
+ # An expression repeated a specified number of times `<expression>{n}`.
42
+ class RepeatExact < Expression
43
+ @expression: Expression
44
+
45
+ @number: Integer
46
+
47
+ attr_reader expression: Expression
48
+
49
+ attr_reader number: Integer
50
+
51
+ def initialize: (Expression expression, Integer number) -> void
52
+
53
+ def parse: (Pestle::ParserState state, Array[Pestle::Pair] pairs) -> bool
54
+
55
+ def children: () -> ::Array[Expression]
56
+ end
57
+
58
+ # An expression repeated at least specified number of times `<expression>{n,}`.
59
+ class RepeatMin < Expression
60
+ @expression: Expression
61
+
62
+ @number: Integer
63
+
64
+ attr_reader expression: Expression
65
+
66
+ attr_reader number: Integer
67
+
68
+ def initialize: (Expression expression, Integer number) -> void
69
+
70
+ def parse: (Pestle::ParserState state, Array[Pestle::Pair] pairs) -> bool
71
+
72
+ def children: () -> ::Array[Expression]
73
+ end
74
+
75
+ # An expression repeated at most specified number of times `<expression>{,n}`.
76
+ class RepeatMax < Expression
77
+ @expression: Expression
78
+
79
+ @number: Integer
80
+
81
+ attr_reader expression: Expression
82
+
83
+ attr_reader number: Integer
84
+
85
+ def initialize: (Expression expression, Integer number) -> void
86
+
87
+ def parse: (Pestle::ParserState state, Array[Pestle::Pair] pairs) -> bool
88
+
89
+ def children: () -> ::Array[Expression]
90
+ end
91
+
92
+ # An expression repeated a specified range of times `<expression>{n,m}`.
93
+ class RepeatMinMax < Expression
94
+ @expression: Expression
95
+
96
+ @min: Integer
97
+
98
+ @max: Integer
99
+
100
+ attr_reader expression: Expression
101
+
102
+ attr_reader min: Integer
103
+
104
+ attr_reader max: Integer
105
+
106
+ def initialize: (Expression expression, Integer min, Integer max) -> void
107
+
108
+ def parse: (Pestle::ParserState state, Array[Pestle::Pair] pairs) -> bool
109
+
110
+ def children: () -> ::Array[Expression]
111
+ end
112
+ end
@@ -0,0 +1,27 @@
1
+ module Pestle::Grammar
2
+ # A positive predicate expression `&<expression>`.
3
+ class PositivePredicate < Expression
4
+ @expression: Expression
5
+
6
+ attr_reader expression: Expression
7
+
8
+ def initialize: (Expression expression, ?tag: String?) -> void
9
+
10
+ def parse: (Pestle::ParserState state, Array[Pestle::Pair] pairs) -> bool
11
+
12
+ def children: () -> ::Array[Expression]
13
+ end
14
+
15
+ # A negative predicate expression `!<expression>`.
16
+ class NegativePredicate < Expression
17
+ @expression: Expression
18
+
19
+ attr_reader expression: Expression
20
+
21
+ def initialize: (Expression expression, ?tag: String?) -> void
22
+
23
+ def parse: (Pestle::ParserState state, Array[Pestle::Pair] pairs) -> bool
24
+
25
+ def children: () -> ::Array[Expression]
26
+ end
27
+ end
@@ -0,0 +1,20 @@
1
+ module Pestle::Grammar
2
+ class Range < Terminal
3
+ @start: String
4
+
5
+ @stop: String
6
+
7
+ @re: Regexp
8
+
9
+ @s: String
10
+
11
+ attr_reader start: String
12
+
13
+ attr_reader stop: String
14
+
15
+ def initialize: (String start, String stop, ?tag: String?) -> void
16
+
17
+ def parse: (Pestle::ParserState state, Array[Pestle::Pair] pairs) -> bool
18
+ end
19
+ end
20
+
@@ -0,0 +1,40 @@
1
+ module Pestle::Grammar
2
+ class Rule < Expression
3
+ @name: String
4
+
5
+ @expression: Expression
6
+
7
+ @modifier: Integer
8
+
9
+ @doc: String?
10
+
11
+ attr_reader name: String
12
+
13
+ attr_reader modifier: Integer
14
+
15
+ attr_reader doc: String?
16
+
17
+ SILENT: Integer
18
+
19
+ ATOMIC: Integer
20
+
21
+ COMPOUND: Integer
22
+
23
+ NONATOMIC: Integer
24
+
25
+ SILENT_ATOMIC: Integer
26
+
27
+ SILENT_COMPOUND: Integer
28
+
29
+ SILENT_NONATOMIC: Integer
30
+
31
+ def initialize: (String name, Expression expression, ?modifier: Integer, ?doc: String?) -> void
32
+
33
+ def parse: (Pestle::ParserState state, Array[Pestle::Pair] pairs) -> bool
34
+
35
+ def children: () -> ::Array[Expression]
36
+ end
37
+
38
+ class BuiltInRule < Rule
39
+ end
40
+ end
@@ -0,0 +1,14 @@
1
+ module Pestle::Grammar
2
+ # The sequence operator `~`.
3
+ class Sequence < Expression
4
+ @expressions: Array[Expression]
5
+
6
+ attr_reader expressions: Array[Expression]
7
+
8
+ def initialize: (*Expression expressions) -> void
9
+
10
+ def parse: (Pestle::ParserState state, Array[Pestle::Pair] pairs) -> bool
11
+
12
+ def children: () -> Array[Expression]
13
+ end
14
+ end
@@ -0,0 +1,39 @@
1
+ module Pestle::Grammar
2
+ # A builtin rule matching any single Unicode character.
3
+ class Any < BuiltInRule
4
+ def initialize: () -> void
5
+ end
6
+
7
+ # A terminal expression matching any single Unicode character.
8
+ class AnyChar < Terminal
9
+ def to_s: () -> "ANY"
10
+
11
+ def parse: (Pestle::ParserState state, Array[Pestle::Pair] pairs) -> bool
12
+ end
13
+
14
+ # A builtin rule matching the start of the input string.
15
+ class SOI < BuiltInRule
16
+ def initialize: () -> void
17
+ end
18
+
19
+ # A terminal expression matching the start of the input string.
20
+ class StartOfInput < Terminal
21
+ def to_s: () -> "SOI"
22
+
23
+ def parse: (Pestle::ParserState state, Array[Pestle::Pair] pairs) -> bool
24
+ end
25
+
26
+ # A builtin rule matching the end of the input string.
27
+ class EOI < BuiltInRule
28
+ def initialize: () -> void
29
+ end
30
+
31
+ # A terminal expression matching the end of the input string.
32
+ class EndOfInput < Terminal
33
+ def to_s: () -> "EOI"
34
+
35
+ def parse: (Pestle::ParserState state, Array[Pestle::Pair] pairs) -> bool
36
+ end
37
+
38
+ SPECIAL_RULES: { "ANY" => Any, "SOI" => SOI, "EOI" => EOI }
39
+ end
@@ -0,0 +1,57 @@
1
+ module Pestle::Grammar
2
+ class PushLiteral < Terminal
3
+ @value: String
4
+
5
+ attr_reader value: String
6
+
7
+ def initialize: (String value, ?tag: String?) -> void
8
+
9
+ def parse: (Pestle::ParserState state, Array[Pestle::Pair] pairs) -> bool
10
+ end
11
+
12
+ class Push < Expression
13
+ @expression: Expression
14
+
15
+ attr_reader expression: Expression
16
+
17
+ def initialize: (Expression expression, ?tag: String?) -> void
18
+
19
+ def parse: (Pestle::ParserState state, Array[Pestle::Pair] pairs) -> bool
20
+
21
+ def children: () -> ::Array[Expression]
22
+ end
23
+
24
+ class PeekSlice < Terminal
25
+ @start: Integer?
26
+
27
+ @stop: Integer?
28
+
29
+ attr_reader start: Integer?
30
+
31
+ attr_reader stop: Integer?
32
+
33
+ def initialize: (Integer? start, Integer? stop, ?tag: String?) -> void
34
+
35
+ def parse: (Pestle::ParserState state, Array[Pestle::Pair] pairs) -> bool
36
+ end
37
+
38
+ class Peek < Terminal
39
+ def parse: (Pestle::ParserState state, Array[Pestle::Pair] pairs) -> bool
40
+ end
41
+
42
+ class PeekAll < Terminal
43
+ def parse: (Pestle::ParserState state, Array[Pestle::Pair] pairs) -> bool
44
+ end
45
+
46
+ class Pop < Terminal
47
+ def parse: (Pestle::ParserState state, Array[Pestle::Pair] pairs) -> bool
48
+ end
49
+
50
+ class PopAll < Terminal
51
+ def parse: (Pestle::ParserState state, Array[Pestle::Pair] pairs) -> bool
52
+ end
53
+
54
+ class Drop < Terminal
55
+ def parse: (Pestle::ParserState state, Array[Pestle::Pair] pairs) -> bool
56
+ end
57
+ end
@@ -0,0 +1,27 @@
1
+ module Pestle::Grammar
2
+ class StringLiteral < Terminal
3
+ @value: ::String
4
+
5
+ @re: Regexp
6
+
7
+ attr_reader value: ::String
8
+
9
+ def initialize: (::String value, ?tag: ::String?) -> void
10
+
11
+ def parse: (Pestle::ParserState state, Array[Pestle::Pair] pairs) -> bool
12
+ end
13
+
14
+ class InsensitiveString < Terminal
15
+ @value: ::String
16
+
17
+ @re: Regexp
18
+
19
+ @s: String
20
+
21
+ attr_reader value: ::String
22
+
23
+ def initialize: (::String value, ?tag: ::String?) -> void
24
+
25
+ def parse: (Pestle::ParserState state, Array[Pestle::Pair] pairs) -> bool
26
+ end
27
+ end
@@ -0,0 +1,15 @@
1
+ module Pestle::Grammar
2
+ # A builtin rule matching Unicode property.
3
+ class UnicodeRule < BuiltInRule
4
+ def initialize: (String name, Regexp re) -> void
5
+ end
6
+
7
+ GENERAL_CATEGORY_MAP: Hash[String, String]
8
+
9
+ BINARY_PROPERTY_MAP: Hash[String, String]
10
+
11
+ SCRIPT_NAMES: Array[String]
12
+
13
+ UNICODE_RULES: Hash[String, UnicodeRule]
14
+
15
+ end