packcr 0.0.6 → 0.0.7
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
|