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.
- checksums.yaml +7 -0
- checksums.yaml.gz.sig +0 -0
- data/.rubocop.yml +59 -0
- data/.ruby-version +1 -0
- data/CHANGELOG.md +3 -0
- data/LICENSE.txt +21 -0
- data/LICENSE_PEST.txt +23 -0
- data/README.md +124 -0
- data/Rakefile +23 -0
- data/Steepfile +19 -0
- data/benchmarks/jsonpath_ips.rb +33 -0
- data/examples/calculator_pratt.rb +157 -0
- data/examples/calculator_prec_climber.rb +225 -0
- data/examples/calculator_stack_vm.rb +291 -0
- data/examples/csv.rb +73 -0
- data/examples/ini.rb +90 -0
- data/examples/json_example.rb +141 -0
- data/examples/jsonpath/README.md +3 -0
- data/examples/jsonpath/jsonpath.pest +182 -0
- data/examples/jsonpath/lib/jsonpath/ast.rb +362 -0
- data/examples/jsonpath/lib/jsonpath/function_extensions.rb +201 -0
- data/examples/jsonpath/lib/jsonpath/node.rb +20 -0
- data/examples/jsonpath/lib/jsonpath/query.rb +25 -0
- data/examples/jsonpath/lib/jsonpath.rb +453 -0
- data/lib/pestle/errors.rb +98 -0
- data/lib/pestle/grammar/builtin_rules/ascii.rb +38 -0
- data/lib/pestle/grammar/builtin_rules/special.rb +63 -0
- data/lib/pestle/grammar/builtin_rules/unicode.rb +291 -0
- data/lib/pestle/grammar/errors.rb +62 -0
- data/lib/pestle/grammar/expression.rb +90 -0
- data/lib/pestle/grammar/expressions/choice.rb +36 -0
- data/lib/pestle/grammar/expressions/group.rb +27 -0
- data/lib/pestle/grammar/expressions/identifier.rb +26 -0
- data/lib/pestle/grammar/expressions/postfix.rb +272 -0
- data/lib/pestle/grammar/expressions/prefix.rb +51 -0
- data/lib/pestle/grammar/expressions/range.rb +26 -0
- data/lib/pestle/grammar/expressions/sequence.rb +38 -0
- data/lib/pestle/grammar/expressions/stack.rb +192 -0
- data/lib/pestle/grammar/expressions/string.rb +46 -0
- data/lib/pestle/grammar/lexer.rb +464 -0
- data/lib/pestle/grammar/parser.rb +340 -0
- data/lib/pestle/grammar/rule.rb +98 -0
- data/lib/pestle/pair.rb +325 -0
- data/lib/pestle/parser.rb +48 -0
- data/lib/pestle/pratt.rb +74 -0
- data/lib/pestle/state.rb +220 -0
- data/lib/pestle/version.rb +5 -0
- data/lib/pestle.rb +24 -0
- data/sig/errors.rbs +22 -0
- data/sig/grammar/ascii.rbs +9 -0
- data/sig/grammar/choice.rbs +14 -0
- data/sig/grammar/errors.rbs +22 -0
- data/sig/grammar/expression.rbs +39 -0
- data/sig/grammar/group.rbs +14 -0
- data/sig/grammar/identifier.rbs +11 -0
- data/sig/grammar/lexer.rbs +85 -0
- data/sig/grammar/parser.rbs +57 -0
- data/sig/grammar/postfix.rbs +112 -0
- data/sig/grammar/prefix.rbs +27 -0
- data/sig/grammar/range.rbs +20 -0
- data/sig/grammar/rule.rbs +40 -0
- data/sig/grammar/sequence.rbs +14 -0
- data/sig/grammar/special.rbs +39 -0
- data/sig/grammar/stack.rbs +57 -0
- data/sig/grammar/string.rbs +27 -0
- data/sig/grammar/unicode.rbs +15 -0
- data/sig/pair.rbs +168 -0
- data/sig/parser.rbs +16 -0
- data/sig/pestle.rbs +5 -0
- data/sig/pratt.rbs +27 -0
- data/sig/state.rbs +95 -0
- data/sig/stdlib/strscan.rbs +3 -0
- data.tar.gz.sig +0 -0
- metadata +141 -0
- metadata.gz.sig +0 -0
|
@@ -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,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
|