packcr 0.0.6 → 0.0.7
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 +4 -4
- data/lib/packcr/cli.rb +18 -16
- data/lib/packcr/code_block.rb +0 -1
- data/lib/packcr/context.rb +19 -17
- data/lib/packcr/generated/context.rb +440 -0
- data/lib/packcr/generated/node/action_node.rb +60 -0
- data/lib/packcr/generated/node/alternate_node.rb +98 -0
- data/lib/packcr/generated/node/capture_node.rb +39 -0
- data/lib/packcr/generated/node/charclass_node.rb +372 -0
- data/lib/packcr/generated/node/eof_node.rb +20 -0
- data/lib/packcr/generated/node/error_node.rb +67 -0
- data/lib/packcr/generated/node/expand_node.rb +30 -0
- data/lib/packcr/generated/node/predicate_node.rb +140 -0
- data/lib/packcr/generated/node/quantity_node.rb +167 -0
- data/lib/packcr/generated/node/reference_node.rb +70 -0
- data/lib/packcr/generated/node/rule_node.rb +63 -0
- data/lib/packcr/generated/node/sequence_node.rb +42 -0
- data/lib/packcr/generated/node/string_node.rb +60 -0
- data/lib/packcr/generator.rb +2 -1
- data/lib/packcr/node/action_node.rb +4 -2
- data/lib/packcr/node/alternate_node.rb +3 -1
- data/lib/packcr/node/capture_node.rb +3 -1
- data/lib/packcr/node/charclass_node.rb +24 -28
- data/lib/packcr/node/eof_node.rb +4 -2
- data/lib/packcr/node/error_node.rb +3 -1
- data/lib/packcr/node/expand_node.rb +8 -5
- data/lib/packcr/node/predicate_node.rb +4 -2
- data/lib/packcr/node/quantity_node.rb +12 -10
- data/lib/packcr/node/reference_node.rb +11 -5
- data/lib/packcr/node/root_node.rb +1 -0
- data/lib/packcr/node/rule_node.rb +7 -4
- data/lib/packcr/node/sequence_node.rb +3 -1
- data/lib/packcr/node/string_node.rb +9 -6
- data/lib/packcr/node.rb +3 -5
- data/lib/packcr/parser.rb +4375 -4056
- data/lib/packcr/stream.rb +17 -12
- data/lib/packcr/templates/context/source.c.erb +187 -410
- data/lib/packcr/templates/context/source.rb.erb +91 -156
- data/lib/packcr/templates/node/action.c.erb +3 -3
- data/lib/packcr/templates/node/action.rb.erb +2 -2
- data/lib/packcr/templates/node/alternate.c.erb +8 -8
- data/lib/packcr/templates/node/alternate.rb.erb +4 -5
- data/lib/packcr/templates/node/capture.c.erb +6 -6
- data/lib/packcr/templates/node/capture.rb.erb +4 -4
- data/lib/packcr/templates/node/charclass.c.erb +12 -12
- data/lib/packcr/templates/node/charclass.rb.erb +6 -6
- data/lib/packcr/templates/node/charclass_any.c.erb +3 -3
- data/lib/packcr/templates/node/charclass_any.rb.erb +2 -2
- data/lib/packcr/templates/node/charclass_fail.c.erb +1 -1
- data/lib/packcr/templates/node/charclass_one.c.erb +8 -8
- data/lib/packcr/templates/node/charclass_one.rb.erb +6 -6
- data/lib/packcr/templates/node/charclass_utf8.c.erb +7 -7
- data/lib/packcr/templates/node/charclass_utf8.rb.erb +3 -3
- data/lib/packcr/templates/node/charclass_utf8_reverse.rb.erb +5 -5
- data/lib/packcr/templates/node/eof.c.erb +1 -1
- data/lib/packcr/templates/node/error.c.erb +7 -7
- data/lib/packcr/templates/node/error.rb.erb +2 -2
- data/lib/packcr/templates/node/expand.c.erb +5 -5
- data/lib/packcr/templates/node/expand.rb.erb +3 -3
- data/lib/packcr/templates/node/predicate.c.erb +10 -10
- data/lib/packcr/templates/node/predicate.rb.erb +6 -6
- data/lib/packcr/templates/node/predicate_neg.c.erb +8 -8
- data/lib/packcr/templates/node/predicate_neg.rb.erb +6 -6
- data/lib/packcr/templates/node/{quantify_many.c.erb → quantity_many.c.erb} +11 -11
- data/lib/packcr/templates/node/{quantify_many.rb.erb → quantity_many.rb.erb} +9 -9
- data/lib/packcr/templates/node/{quantify_one.c.erb → quantity_one.c.erb} +7 -7
- data/lib/packcr/templates/node/{quantify_one.rb.erb → quantity_one.rb.erb} +4 -4
- data/lib/packcr/templates/node/reference.c.erb +14 -2
- data/lib/packcr/templates/node/reference.rb.erb +16 -4
- data/lib/packcr/templates/node/reference_reverse.rb.erb +16 -4
- data/lib/packcr/templates/node/rule.c.erb +9 -2
- data/lib/packcr/templates/node/rule.rb.erb +26 -19
- data/lib/packcr/templates/node/string_many.c.erb +5 -5
- data/lib/packcr/templates/node/string_many.rb.erb +3 -3
- data/lib/packcr/templates/node/string_one.c.erb +4 -4
- data/lib/packcr/templates/node/string_one.rb.erb +3 -3
- data/lib/packcr/util.rb +21 -16
- data/lib/packcr/version.rb +1 -1
- data/lib/packcr.rb +8 -11
- metadata +37 -9
- data/lib/packcr/tokenizer.rb +0 -2948
@@ -18,59 +18,53 @@ class Packcr
|
|
18
18
|
end
|
19
19
|
|
20
20
|
def generate_code(gen, onfail, indent, bare, oncut: nil)
|
21
|
-
if gen.ascii
|
22
|
-
|
23
|
-
|
24
|
-
return generate_utf8_charclass_code(gen, onfail, indent, bare)
|
25
|
-
end
|
21
|
+
return generate_ascii_code(gen, onfail, indent, bare) if gen.ascii
|
22
|
+
|
23
|
+
generate_utf8_charclass_code(gen, onfail, indent, bare)
|
26
24
|
end
|
27
25
|
|
28
26
|
def generate_reverse_code(gen, onsuccess, indent, bare, oncut: nil)
|
29
|
-
if gen.ascii
|
30
|
-
|
31
|
-
|
32
|
-
return generate_utf8_charclass_reverse_code(gen, onsuccess, indent, bare)
|
33
|
-
end
|
27
|
+
raise "unexpected" if gen.ascii
|
28
|
+
|
29
|
+
generate_utf8_charclass_reverse_code(gen, onsuccess, indent, bare)
|
34
30
|
end
|
35
31
|
|
36
32
|
def reachability
|
37
|
-
charclass =
|
33
|
+
charclass = value
|
38
34
|
n = charclass&.length || 0
|
39
|
-
if charclass.nil? || n > 0
|
40
|
-
|
41
|
-
|
42
|
-
return Packcr::CODE_REACH__ALWAYS_FAIL
|
43
|
-
end
|
35
|
+
return Packcr::CODE_REACH__BOTH if charclass.nil? || n > 0
|
36
|
+
|
37
|
+
Packcr::CODE_REACH__ALWAYS_FAIL
|
44
38
|
end
|
45
39
|
|
46
40
|
private
|
47
41
|
|
48
42
|
def generate_utf8_charclass_code(gen, onfail, indent, bare)
|
49
|
-
charclass =
|
43
|
+
charclass = value
|
50
44
|
if charclass && charclass.encoding != Encoding::UTF_8
|
51
45
|
charclass = charclass.dup.force_encoding(Encoding::UTF_8)
|
52
46
|
end
|
53
47
|
n = charclass&.length || 0
|
54
48
|
if charclass.nil? || n > 0
|
55
|
-
gen.write Packcr.
|
49
|
+
gen.write Packcr.format_code(get_utf8_code(gen, onfail, indent, bare, charclass, n), indent: indent, unwrap: bare)
|
56
50
|
else
|
57
|
-
gen.write Packcr.
|
51
|
+
gen.write Packcr.format_code(get_fail_code(gen, onfail, indent, bare), indent: indent)
|
58
52
|
end
|
59
53
|
end
|
60
54
|
|
61
55
|
def generate_utf8_charclass_reverse_code(gen, onsuccess, indent, bare)
|
62
|
-
charclass =
|
56
|
+
charclass = value
|
63
57
|
if charclass && charclass.encoding != Encoding::UTF_8
|
64
58
|
charclass = charclass.dup.force_encoding(Encoding::UTF_8)
|
65
59
|
end
|
66
60
|
n = charclass&.length || 0
|
67
|
-
|
68
|
-
|
69
|
-
|
61
|
+
return unless charclass.nil? || n > 0
|
62
|
+
|
63
|
+
gen.write Packcr.format_code(get_utf8_reverse_code(gen, onsuccess, indent, bare, charclass, n), indent: indent, unwrap: bare)
|
70
64
|
end
|
71
65
|
|
72
66
|
def generate_ascii_code(gen, onfail, indent, bare)
|
73
|
-
charclass =
|
67
|
+
charclass = value
|
74
68
|
if charclass
|
75
69
|
n = charclass.length
|
76
70
|
a = charclass[0] == "^"
|
@@ -80,15 +74,15 @@ class Packcr
|
|
80
74
|
end
|
81
75
|
if n > 0
|
82
76
|
if n > 1
|
83
|
-
gen.write Packcr.
|
77
|
+
gen.write Packcr.format_code(get_code(gen, onfail, indent, bare, charclass, n, a), indent: indent, unwrap: bare)
|
84
78
|
else
|
85
|
-
gen.write Packcr.
|
79
|
+
gen.write Packcr.format_code(get_one_code(gen, onfail, indent, bare, charclass, n, a), indent: indent)
|
86
80
|
end
|
87
81
|
else
|
88
|
-
gen.write Packcr.
|
82
|
+
gen.write Packcr.format_code(get_fail_code(gen, onfail, indent, bare), indent: indent)
|
89
83
|
end
|
90
84
|
else
|
91
|
-
gen.write Packcr.
|
85
|
+
gen.write Packcr.format_code(get_any_code(gen, onfail, indent, bare, charclass), indent: indent)
|
92
86
|
end
|
93
87
|
end
|
94
88
|
|
@@ -101,3 +95,5 @@ class Packcr
|
|
101
95
|
end
|
102
96
|
end
|
103
97
|
end
|
98
|
+
|
99
|
+
require "packcr/generated/node/charclass_node"
|
data/lib/packcr/node/eof_node.rb
CHANGED
@@ -6,11 +6,11 @@ class Packcr
|
|
6
6
|
end
|
7
7
|
|
8
8
|
def generate_code(gen, onfail, indent, bare, oncut: nil)
|
9
|
-
gen.write Packcr.
|
9
|
+
gen.write Packcr.format_code(get_code(gen, onfail, indent, bare, oncut), indent: indent, unwrap: bare)
|
10
10
|
end
|
11
11
|
|
12
12
|
def reachability
|
13
|
-
|
13
|
+
Packcr::CODE_REACH__BOTH
|
14
14
|
end
|
15
15
|
|
16
16
|
def to_h
|
@@ -21,3 +21,5 @@ class Packcr
|
|
21
21
|
end
|
22
22
|
end
|
23
23
|
end
|
24
|
+
|
25
|
+
require "packcr/generated/node/eof_node"
|
@@ -30,7 +30,7 @@ class Packcr
|
|
30
30
|
end
|
31
31
|
|
32
32
|
def generate_code(gen, onfail, indent, bare, oncut: nil)
|
33
|
-
gen.write Packcr.
|
33
|
+
gen.write Packcr.format_code(get_code(gen, onfail, indent, bare, oncut), indent: indent, unwrap: bare)
|
34
34
|
end
|
35
35
|
|
36
36
|
def reachability
|
@@ -68,3 +68,5 @@ class Packcr
|
|
68
68
|
end
|
69
69
|
end
|
70
70
|
end
|
71
|
+
|
72
|
+
require "packcr/generated/node/error_node"
|
@@ -16,11 +16,11 @@ class Packcr
|
|
16
16
|
end
|
17
17
|
|
18
18
|
def generate_code(gen, onfail, indent, bare, oncut: nil)
|
19
|
-
gen.write Packcr.
|
19
|
+
gen.write Packcr.format_code(get_code(gen, onfail, indent, bare, oncut), indent: indent, unwrap: bare)
|
20
20
|
end
|
21
21
|
|
22
22
|
def reachability
|
23
|
-
|
23
|
+
Packcr::CODE_REACH__BOTH
|
24
24
|
end
|
25
25
|
|
26
26
|
def verify_captures(ctx, capts)
|
@@ -28,11 +28,12 @@ class Packcr
|
|
28
28
|
unless capt.is_a?(Packcr::Node::CaptureNode)
|
29
29
|
raise "unexpected capture: #{capt.class}"
|
30
30
|
end
|
31
|
+
|
31
32
|
index == capt.index
|
32
33
|
end
|
33
|
-
if
|
34
|
-
|
35
|
-
|
34
|
+
return if found || index.nil?
|
35
|
+
|
36
|
+
ctx.error line + 1, col + 1, "Capture #{index + 1} not available at this position"
|
36
37
|
end
|
37
38
|
|
38
39
|
def to_h
|
@@ -44,3 +45,5 @@ class Packcr
|
|
44
45
|
end
|
45
46
|
end
|
46
47
|
end
|
48
|
+
|
49
|
+
require "packcr/generated/node/expand_node"
|
@@ -17,9 +17,9 @@ class Packcr
|
|
17
17
|
|
18
18
|
def generate_code(gen, onfail, indent, bare, oncut: nil)
|
19
19
|
if neg
|
20
|
-
gen.write Packcr.
|
20
|
+
gen.write Packcr.format_code(get_neg_code(gen, onfail, indent, bare, oncut), indent: indent, unwrap: bare)
|
21
21
|
else
|
22
|
-
gen.write Packcr.
|
22
|
+
gen.write Packcr.format_code(get_code(gen, onfail, indent, bare, oncut), indent: indent, unwrap: bare)
|
23
23
|
end
|
24
24
|
end
|
25
25
|
|
@@ -45,3 +45,5 @@ class Packcr
|
|
45
45
|
end
|
46
46
|
end
|
47
47
|
end
|
48
|
+
|
49
|
+
require "packcr/generated/node/predicate_node"
|
@@ -18,12 +18,12 @@ class Packcr
|
|
18
18
|
|
19
19
|
def generate_code(gen, onfail, indent, bare, oncut: nil)
|
20
20
|
if max > 1 || max < 0
|
21
|
-
gen.write Packcr.
|
21
|
+
gen.write Packcr.format_code(get_many_code(gen, onfail, indent, bare, oncut), indent: indent, unwrap: bare)
|
22
22
|
elsif max == 1
|
23
23
|
if min > 0
|
24
|
-
gen.write gen.generate_code(expr, onfail, indent, bare)
|
24
|
+
gen.write gen.generate_code(expr, onfail, indent, bare, oncut: oncut)
|
25
25
|
else
|
26
|
-
gen.write Packcr.
|
26
|
+
gen.write Packcr.format_code(get_one_code(gen, onfail, indent, bare, oncut), indent: indent, unwrap: bare)
|
27
27
|
end
|
28
28
|
end
|
29
29
|
end
|
@@ -36,15 +36,15 @@ class Packcr
|
|
36
36
|
if expr.reachability == Packcr::CODE_REACH__ALWAYS_FAIL
|
37
37
|
return Packcr::CODE_REACH__ALWAYS_FAIL
|
38
38
|
end
|
39
|
-
|
39
|
+
|
40
|
+
Packcr::CODE_REACH__BOTH
|
40
41
|
elsif max == 1
|
41
|
-
if min > 0
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
end
|
42
|
+
return expr.reachability if min > 0
|
43
|
+
|
44
|
+
Packcr::CODE_REACH__ALWAYS_SUCCEED
|
45
|
+
|
46
46
|
else
|
47
|
-
|
47
|
+
Packcr::CODE_REACH__ALWAYS_SUCCEED
|
48
48
|
end
|
49
49
|
end
|
50
50
|
|
@@ -63,3 +63,5 @@ class Packcr
|
|
63
63
|
end
|
64
64
|
end
|
65
65
|
end
|
66
|
+
|
67
|
+
require "packcr/generated/node/quantity_node"
|
@@ -21,11 +21,11 @@ class Packcr
|
|
21
21
|
end
|
22
22
|
|
23
23
|
def generate_code(gen, onfail, indent, bare, oncut: nil)
|
24
|
-
gen.write Packcr.
|
24
|
+
gen.write Packcr.format_code(get_code(gen, onfail, indent, bare, oncut), indent: indent, unwrap: bare)
|
25
25
|
end
|
26
26
|
|
27
27
|
def generate_reverse_code(gen, onsuccess, indent, bare, oncut: nil)
|
28
|
-
gen.write Packcr.
|
28
|
+
gen.write Packcr.format_code(get_reverse_code(gen, onsuccess, indent, bare, oncut), indent: indent)
|
29
29
|
end
|
30
30
|
|
31
31
|
def reachability
|
@@ -34,10 +34,12 @@ class Packcr
|
|
34
34
|
|
35
35
|
def setup_rule(rule)
|
36
36
|
return unless var
|
37
|
+
|
37
38
|
i = rule.vars.index do |ref|
|
38
39
|
unless ref.is_a?(Packcr::Node::ReferenceNode)
|
39
40
|
raise "Unexpected node type: #{ref.class}"
|
40
41
|
end
|
42
|
+
|
41
43
|
var == ref.var
|
42
44
|
end
|
43
45
|
if !i
|
@@ -54,6 +56,7 @@ class Packcr
|
|
54
56
|
unless var.is_a?(Packcr::Node::ReferenceNode)
|
55
57
|
raise "unexpected var: #{var.class}"
|
56
58
|
end
|
59
|
+
|
57
60
|
index == var.index
|
58
61
|
end
|
59
62
|
vars.push(self) if !found
|
@@ -61,14 +64,15 @@ class Packcr
|
|
61
64
|
|
62
65
|
def link_references(ctx)
|
63
66
|
rule = ctx.root.rule(name)
|
64
|
-
if
|
65
|
-
ctx.error line + 1, col + 1, "No definition of rule '#{name}'"
|
66
|
-
else
|
67
|
+
if rule
|
67
68
|
unless rule.is_a?(Packcr::Node::RuleNode)
|
68
69
|
raise "unexpected node type #{rule.class}"
|
69
70
|
end
|
71
|
+
|
70
72
|
rule.add_ref
|
71
73
|
self.rule = rule
|
74
|
+
else
|
75
|
+
ctx.error line + 1, col + 1, "No definition of rule '#{name}'"
|
72
76
|
end
|
73
77
|
end
|
74
78
|
|
@@ -82,3 +86,5 @@ class Packcr
|
|
82
86
|
end
|
83
87
|
end
|
84
88
|
end
|
89
|
+
|
90
|
+
require "packcr/generated/node/reference_node"
|
@@ -22,7 +22,7 @@ class Packcr
|
|
22
22
|
end
|
23
23
|
|
24
24
|
def generate_code(gen, onfail, indent, bare, oncut: nil)
|
25
|
-
gen.write Packcr.
|
25
|
+
gen.write Packcr.format_code(get_code(gen, onfail, indent, bare, oncut), indent: indent, unwrap: bare)
|
26
26
|
end
|
27
27
|
|
28
28
|
def reachability
|
@@ -37,9 +37,10 @@ class Packcr
|
|
37
37
|
|
38
38
|
def verify_rule_reference(ctx)
|
39
39
|
return if top
|
40
|
-
|
41
|
-
|
42
|
-
|
40
|
+
|
41
|
+
return unless ref == 0
|
42
|
+
|
43
|
+
ctx.error line + 1, col + 1, "Never used rule '#{name}'"
|
43
44
|
end
|
44
45
|
|
45
46
|
def add_ref
|
@@ -63,3 +64,5 @@ class Packcr
|
|
63
64
|
end
|
64
65
|
end
|
65
66
|
end
|
67
|
+
|
68
|
+
require "packcr/generated/node/rule_node"
|
@@ -54,7 +54,7 @@ class Packcr
|
|
54
54
|
end
|
55
55
|
|
56
56
|
def generate_code(gen, onfail, indent, bare, oncut: nil)
|
57
|
-
gen.write Packcr.
|
57
|
+
gen.write Packcr.format_code(get_code(gen, onfail, indent, bare, oncut), indent: indent)
|
58
58
|
end
|
59
59
|
|
60
60
|
def reachability
|
@@ -79,3 +79,5 @@ class Packcr
|
|
79
79
|
end
|
80
80
|
end
|
81
81
|
end
|
82
|
+
|
83
|
+
require "packcr/generated/node/sequence_node"
|
@@ -19,12 +19,12 @@ class Packcr
|
|
19
19
|
|
20
20
|
def generate_code(gen, onfail, indent, bare, oncut: nil)
|
21
21
|
n = value&.length || 0
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
22
|
+
return unless n > 0
|
23
|
+
|
24
|
+
if n > 1
|
25
|
+
gen.write Packcr.format_code(get_many_code(gen, onfail, indent, bare, oncut, n), indent: indent)
|
26
|
+
else
|
27
|
+
gen.write Packcr.format_code(get_one_code(gen, onfail, indent, bare, oncut, n), indent: indent)
|
28
28
|
end
|
29
29
|
end
|
30
30
|
|
@@ -33,6 +33,7 @@ class Packcr
|
|
33
33
|
if n <= 0
|
34
34
|
return Packcr::CODE_REACH__ALWAYS_SUCCEED
|
35
35
|
end
|
36
|
+
|
36
37
|
Packcr::CODE_REACH__BOTH
|
37
38
|
end
|
38
39
|
|
@@ -45,3 +46,5 @@ class Packcr
|
|
45
46
|
end
|
46
47
|
end
|
47
48
|
end
|
49
|
+
|
50
|
+
require "packcr/generated/node/string_node"
|
data/lib/packcr/node.rb
CHANGED
@@ -20,11 +20,9 @@ class Packcr
|
|
20
20
|
end
|
21
21
|
end
|
22
22
|
|
23
|
-
def link_references(ctx)
|
24
|
-
end
|
23
|
+
def link_references(ctx); end
|
25
24
|
|
26
|
-
def setup_rule(rule)
|
27
|
-
end
|
25
|
+
def setup_rule(rule); end
|
28
26
|
|
29
27
|
def setup(ctx, rule)
|
30
28
|
setup_rule(rule)
|
@@ -39,7 +37,7 @@ class Packcr
|
|
39
37
|
[]
|
40
38
|
end
|
41
39
|
|
42
|
-
def reversible?(
|
40
|
+
def reversible?(_gen)
|
43
41
|
false
|
44
42
|
end
|
45
43
|
|