packcr 0.0.8 → 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 +4 -4
- data/lib/packcr/context.rb +14 -5
- data/lib/packcr/generated/context.rb +189 -85
- data/lib/packcr/generated/node/action_node.rb +17 -0
- data/lib/packcr/generated/node/alternate_node.rb +52 -6
- data/lib/packcr/generated/node/capture_node.rb +15 -0
- data/lib/packcr/generated/node/charclass_node.rb +67 -0
- data/lib/packcr/generated/node/eof_node.rb +7 -0
- data/lib/packcr/generated/node/error_node.rb +7 -0
- data/lib/packcr/generated/node/expand_node.rb +7 -0
- data/lib/packcr/generated/node/predicate_node.rb +33 -0
- data/lib/packcr/generated/node/quantity_node.rb +54 -0
- data/lib/packcr/generated/node/reference_node.rb +14 -0
- data/lib/packcr/generated/node/rule_node.rb +31 -0
- data/lib/packcr/generated/node/sequence_node.rb +18 -0
- data/lib/packcr/generated/node/string_node.rb +24 -0
- data/lib/packcr/node/reference_node.rb +1 -0
- data/lib/packcr/node/rule_node.rb +2 -1
- data/lib/packcr/parser.rb +403 -254
- data/lib/packcr/stream.rb +1 -1
- data/lib/packcr/templates/context/source.c.erb +30 -26
- data/lib/packcr/templates/context/source.rb.erb +160 -159
- data/lib/packcr/templates/context/source.rs.erb +625 -0
- data/lib/packcr/templates/node/action.rs.erb +6 -0
- data/lib/packcr/templates/node/alternate.rs.erb +39 -0
- data/lib/packcr/templates/node/capture.rs.erb +13 -0
- data/lib/packcr/templates/node/charclass_utf8.rs.erb +41 -0
- data/lib/packcr/templates/node/predicate_neg.rs.erb +24 -0
- data/lib/packcr/templates/node/quantity_many.rs.erb +50 -0
- data/lib/packcr/templates/node/reference.rs.erb +3 -0
- data/lib/packcr/templates/node/rule.rs.erb +34 -0
- data/lib/packcr/templates/node/sequence.rs.erb +12 -0
- data/lib/packcr/templates/node/string_many.rs.erb +10 -0
- data/lib/packcr/templates/node/string_one.rs.erb +9 -0
- data/lib/packcr/util.rb +9 -0
- data/lib/packcr/version.rb +1 -1
- metadata +16 -65
@@ -92,6 +92,8 @@ class Packcr
|
|
92
92
|
end
|
93
93
|
erbout << "@position_offset += 1\n".freeze
|
94
94
|
erbout
|
95
|
+
else
|
96
|
+
raise "unknown lang #{gen.lang}"
|
95
97
|
end
|
96
98
|
end
|
97
99
|
|
@@ -117,6 +119,8 @@ class Packcr
|
|
117
119
|
erbout << "@position_offset += 1\n".freeze
|
118
120
|
|
119
121
|
erbout
|
122
|
+
else
|
123
|
+
raise "unknown lang #{gen.lang}"
|
120
124
|
end
|
121
125
|
end
|
122
126
|
|
@@ -132,6 +136,8 @@ class Packcr
|
|
132
136
|
erbout << "throw(#{onfail})\n".freeze
|
133
137
|
|
134
138
|
erbout
|
139
|
+
else
|
140
|
+
raise "unknown lang #{gen.lang}"
|
135
141
|
end
|
136
142
|
end
|
137
143
|
|
@@ -165,6 +171,8 @@ class Packcr
|
|
165
171
|
end
|
166
172
|
erbout << "@position_offset += 1\n".freeze
|
167
173
|
erbout
|
174
|
+
else
|
175
|
+
raise "unknown lang #{gen.lang}"
|
168
176
|
end
|
169
177
|
end
|
170
178
|
|
@@ -295,6 +303,63 @@ class Packcr
|
|
295
303
|
erbout << "@position_offset += 1\n".freeze
|
296
304
|
|
297
305
|
erbout
|
306
|
+
when :rs
|
307
|
+
erbout = +""
|
308
|
+
a = charclass && charclass[0] == "^"
|
309
|
+
i = a ? 1 : 0
|
310
|
+
any_code = !charclass || (a && n == 1)
|
311
|
+
erbout << "let (#{any_code ? "_" : ""}u, n) = self.get_char_as_utf32();\nif n == 0 {\n break 'L#{format("%04d", onfail)};\n}\n".freeze
|
312
|
+
|
313
|
+
unless any_code
|
314
|
+
erbout << "if ".freeze
|
315
|
+
if !a
|
316
|
+
|
317
|
+
erbout << "!(".freeze
|
318
|
+
end
|
319
|
+
while i < n
|
320
|
+
if charclass[i] == "\\" && i + 1 < n
|
321
|
+
i += 1
|
322
|
+
end
|
323
|
+
u = charclass[i].ord
|
324
|
+
i += 1
|
325
|
+
if r
|
326
|
+
# character range
|
327
|
+
|
328
|
+
erbout << "(0x#{format("%06x", u0)}..=0x#{format("%06x", u)}).contains(&u)".freeze
|
329
|
+
|
330
|
+
if i < n
|
331
|
+
erbout << " || ".freeze
|
332
|
+
end
|
333
|
+
u0 = 0
|
334
|
+
r = false
|
335
|
+
elsif charclass[i] != "-" || i == n - 1 # the individual '-' character is valid when it is at the first or the last position
|
336
|
+
# single character
|
337
|
+
|
338
|
+
erbout << "u == 0x#{format("%06x", u)}".freeze
|
339
|
+
if i < n
|
340
|
+
erbout << " || ".freeze
|
341
|
+
end
|
342
|
+
u0 = 0
|
343
|
+
r = false
|
344
|
+
elsif charclass[i] == "-"
|
345
|
+
i += 1
|
346
|
+
u0 = u
|
347
|
+
r = true
|
348
|
+
else
|
349
|
+
raise "unexpected charclass #{charclass[i]}"
|
350
|
+
end
|
351
|
+
end
|
352
|
+
if !a
|
353
|
+
erbout << ") ".freeze
|
354
|
+
end
|
355
|
+
|
356
|
+
erbout << "{\n break 'L#{format("%04d", onfail)};\n}\n".freeze
|
357
|
+
end
|
358
|
+
erbout << "self.input.position_offset += n;\n".freeze
|
359
|
+
|
360
|
+
erbout
|
361
|
+
else
|
362
|
+
raise "unknown lang #{gen.lang}"
|
298
363
|
end
|
299
364
|
end
|
300
365
|
|
@@ -365,6 +430,8 @@ class Packcr
|
|
365
430
|
erbout << "end\n".freeze
|
366
431
|
|
367
432
|
erbout
|
433
|
+
else
|
434
|
+
raise "unknown lang #{gen.lang}"
|
368
435
|
end
|
369
436
|
end
|
370
437
|
end
|
@@ -13,6 +13,13 @@ class Packcr
|
|
13
13
|
erbout << "if refill_buffer(1) >= 1\n throw(#{onfail})\nend\n".freeze
|
14
14
|
|
15
15
|
erbout
|
16
|
+
when :rs
|
17
|
+
erbout = +""
|
18
|
+
erbout << "/* lib/packcr/templates/node/eof.rs.erb */\n\n".freeze
|
19
|
+
|
20
|
+
erbout
|
21
|
+
else
|
22
|
+
raise "unknown lang #{gen.lang}"
|
16
23
|
end
|
17
24
|
end
|
18
25
|
end
|
@@ -60,6 +60,13 @@ class Packcr
|
|
60
60
|
erbout << " ),\n nil,\n 0\n )\n\n throw(#{onfail})\nend\n".freeze
|
61
61
|
|
62
62
|
erbout
|
63
|
+
when :rs
|
64
|
+
erbout = +""
|
65
|
+
erbout << "/* lib/packcr/templates/node/error.rs.erb */\n\n".freeze
|
66
|
+
|
67
|
+
erbout
|
68
|
+
else
|
69
|
+
raise "unknown lang #{gen.lang}"
|
63
70
|
end
|
64
71
|
end
|
65
72
|
end
|
@@ -23,6 +23,13 @@ class Packcr
|
|
23
23
|
erbout << " @position_offset += n#{gen.level}\nend\n".freeze
|
24
24
|
|
25
25
|
erbout
|
26
|
+
when :rs
|
27
|
+
erbout = +""
|
28
|
+
erbout << "/* lib/packcr/templates/node/expand.rs.erb */\n\n".freeze
|
29
|
+
|
30
|
+
erbout
|
31
|
+
else
|
32
|
+
raise "unknown lang #{gen.lang}"
|
26
33
|
end
|
27
34
|
end
|
28
35
|
end
|
@@ -72,6 +72,8 @@ class Packcr
|
|
72
72
|
erbout << "end\n".freeze
|
73
73
|
|
74
74
|
erbout
|
75
|
+
else
|
76
|
+
raise "unknown lang #{gen.lang}"
|
75
77
|
end
|
76
78
|
end
|
77
79
|
|
@@ -133,6 +135,37 @@ class Packcr
|
|
133
135
|
end
|
134
136
|
end
|
135
137
|
erbout
|
138
|
+
when :rs
|
139
|
+
erbout = +""
|
140
|
+
l = gen.next_label
|
141
|
+
r = expr.reachability
|
142
|
+
erbout << "let p = self.input.position_offset;\n".freeze
|
143
|
+
|
144
|
+
if gen.location
|
145
|
+
erbout << "TODO\n".freeze
|
146
|
+
end
|
147
|
+
erbout << "'L#{format("%04d", l)}: {\n {\n#{gen.generate_code(expr, l, 4, false)} }\n".freeze
|
148
|
+
|
149
|
+
if r != Packcr::CODE_REACH__ALWAYS_FAIL
|
150
|
+
erbout << " self.input.position_offset = p;\n".freeze
|
151
|
+
|
152
|
+
if gen.location
|
153
|
+
erbout << " TODO\n".freeze
|
154
|
+
end
|
155
|
+
erbout << " break 'L#{format("%04d", onfail)};\n".freeze
|
156
|
+
end
|
157
|
+
erbout << "}\n".freeze
|
158
|
+
|
159
|
+
if r != Packcr::CODE_REACH__ALWAYS_SUCCEED
|
160
|
+
erbout << "self.input.position_offset = p;\n".freeze
|
161
|
+
|
162
|
+
if gen.location
|
163
|
+
erbout << "TODO\n".freeze
|
164
|
+
end
|
165
|
+
end
|
166
|
+
erbout
|
167
|
+
else
|
168
|
+
raise "unknown lang #{gen.lang}"
|
136
169
|
end
|
137
170
|
end
|
138
171
|
end
|
@@ -106,6 +106,58 @@ class Packcr
|
|
106
106
|
erbout << " answer.thunks[m#{gen.level}..-1] = []\n throw(#{onfail})\nend\n".freeze
|
107
107
|
end
|
108
108
|
erbout
|
109
|
+
when :rs
|
110
|
+
erbout = +""
|
111
|
+
if min > 0
|
112
|
+
erbout << "let p0 = self.input.position_offset;\n".freeze
|
113
|
+
|
114
|
+
if gen.location
|
115
|
+
erbout << "TODO\n".freeze
|
116
|
+
end
|
117
|
+
end
|
118
|
+
use_count = max >= 0 || min > 0
|
119
|
+
if use_count
|
120
|
+
erbout << "let mut i = -1;\n".freeze
|
121
|
+
end
|
122
|
+
m = gen.next_label
|
123
|
+
erbout << "'L#{format("%04d", m)}: loop {\n".freeze
|
124
|
+
|
125
|
+
if use_count
|
126
|
+
erbout << " i += 1;\n".freeze
|
127
|
+
end
|
128
|
+
if max >= 0
|
129
|
+
erbout << " if i >= #{max} { break; }\n".freeze
|
130
|
+
end
|
131
|
+
erbout << " let p = self.input.position_offset;\n".freeze
|
132
|
+
|
133
|
+
if (r != Packcr::CODE_REACH__ALWAYS_SUCCEED) && gen.location
|
134
|
+
erbout << " TODO\n".freeze
|
135
|
+
end
|
136
|
+
l = gen.next_label
|
137
|
+
r = expr.reachability
|
138
|
+
erbout << " 'L#{format("%04d", l)}: {\n#{gen.generate_code(expr, l, 8, false)} if self.input.position_offset == p {\n break 'L#{format("%04d", m)};\n }\n".freeze
|
139
|
+
|
140
|
+
if r != Packcr::CODE_REACH__ALWAYS_SUCCEED
|
141
|
+
erbout << " continue 'L#{format("%04d", m)};\n }\n self.input.position_offset = p;\n".freeze
|
142
|
+
|
143
|
+
if gen.location
|
144
|
+
erbout << " TODO\n".freeze
|
145
|
+
end
|
146
|
+
erbout << " break 'L#{format("%04d", m)};\n".freeze
|
147
|
+
end
|
148
|
+
erbout << "}\n".freeze
|
149
|
+
|
150
|
+
if min > 0
|
151
|
+
erbout << "if i < #{min} {\n self.input.position_offset = p0;\n".freeze
|
152
|
+
|
153
|
+
if gen.location
|
154
|
+
erbout << " TODO\n".freeze
|
155
|
+
end
|
156
|
+
erbout << " break 'L#{format("%04d", onfail)};\n}\n".freeze
|
157
|
+
end
|
158
|
+
erbout
|
159
|
+
else
|
160
|
+
raise "unknown lang #{gen.lang}"
|
109
161
|
end
|
110
162
|
end
|
111
163
|
|
@@ -159,6 +211,8 @@ class Packcr
|
|
159
211
|
erbout << " @position_offset = pos#{gen.level}\n answer.thunks[n#{gen.level}..-1] = []\nend\n".freeze
|
160
212
|
end
|
161
213
|
erbout
|
214
|
+
else
|
215
|
+
raise "unknown lang #{gen.lang}"
|
162
216
|
end
|
163
217
|
end
|
164
218
|
end
|
@@ -37,6 +37,13 @@ class Packcr
|
|
37
37
|
end
|
38
38
|
erbout << ")\n throw(#{onfail})\n end\nend\n".freeze
|
39
39
|
erbout
|
40
|
+
when :rs
|
41
|
+
erbout = +""
|
42
|
+
erbout << "if !self.apply_rule(Rule::#{Packcr.camelize(name)}, &mut answer, #{index || 0}, offset, limits.clone()) {\n break 'L#{format("%04d", onfail)};\n}\n".freeze
|
43
|
+
|
44
|
+
erbout
|
45
|
+
else
|
46
|
+
raise "unknown lang #{gen.lang}"
|
40
47
|
end
|
41
48
|
end
|
42
49
|
|
@@ -63,6 +70,13 @@ class Packcr
|
|
63
70
|
end
|
64
71
|
erbout << ")\n throw(#{onsuccess})\n end\nend\n".freeze
|
65
72
|
erbout
|
73
|
+
when :rs
|
74
|
+
erbout = +""
|
75
|
+
erbout << "/* lib/packcr/templates/node/reference_reverse.rs.erb */\n\n".freeze
|
76
|
+
|
77
|
+
erbout
|
78
|
+
else
|
79
|
+
raise "unknown lang #{gen.lang}"
|
66
80
|
end
|
67
81
|
end
|
68
82
|
end
|
@@ -56,6 +56,37 @@ class Packcr
|
|
56
56
|
erbout << "end\n".freeze
|
57
57
|
|
58
58
|
erbout
|
59
|
+
when :rs
|
60
|
+
erbout = +""
|
61
|
+
for_ref = has_ref ? "" : "_"
|
62
|
+
erbout << "#[allow(non_snake_case)]\nfn evaluate_rule_#{name}(\n &mut self,\n #{for_ref}offset: usize,\n".freeze
|
63
|
+
|
64
|
+
if gen.location
|
65
|
+
erbout << " TODO\n".freeze
|
66
|
+
end
|
67
|
+
erbout << " #{for_ref}limits: Option<RuleSet>,\n) -> Option<ThunkChunk> {\n let mut answer = ThunkChunk::new(self.input.position_offset);\n".freeze
|
68
|
+
|
69
|
+
if gen.location
|
70
|
+
erbout << " TODO\n".freeze
|
71
|
+
end
|
72
|
+
erbout << " self.level += 1;\n answer.capts.resize(#{capts.length});\n".freeze
|
73
|
+
|
74
|
+
if !vars.empty?
|
75
|
+
erbout << " answer.values.clear();\n".freeze
|
76
|
+
end
|
77
|
+
r = expr.reachability
|
78
|
+
if r == Packcr::CODE_REACH__ALWAYS_SUCCEED
|
79
|
+
|
80
|
+
erbout << "#{gen.generate_code(expr, 0, 4, false)} self.level -= 1;\n return Some(answer);\n".freeze
|
81
|
+
|
82
|
+
else
|
83
|
+
erbout << " 'L0000: {\n#{gen.generate_code(expr, 0, 8, false)} self.level -= 1;\n return Some(answer);\n }\n self.level -= 1;\n return None;\n".freeze
|
84
|
+
end
|
85
|
+
erbout << "}\n".freeze
|
86
|
+
|
87
|
+
erbout
|
88
|
+
else
|
89
|
+
raise "unknown lang #{gen.lang}"
|
59
90
|
end
|
60
91
|
end
|
61
92
|
end
|
@@ -35,6 +35,24 @@ class Packcr
|
|
35
35
|
break
|
36
36
|
end
|
37
37
|
erbout
|
38
|
+
when :rs
|
39
|
+
erbout = +""
|
40
|
+
if @cut && oncut
|
41
|
+
onfail = oncut
|
42
|
+
oncut = nil
|
43
|
+
end
|
44
|
+
nodes.each_with_index do |expr, i|
|
45
|
+
erbout << "#{gen.generate_code(expr, onfail, 0, false, oncut: oncut)}".freeze
|
46
|
+
next unless expr.reachability == Packcr::CODE_REACH__ALWAYS_FAIL
|
47
|
+
|
48
|
+
if i < nodes.length - 1
|
49
|
+
erbout << "/* unreachable codes omitted */\n".freeze
|
50
|
+
end
|
51
|
+
break
|
52
|
+
end
|
53
|
+
erbout
|
54
|
+
else
|
55
|
+
raise "unknown lang #{gen.lang}"
|
38
56
|
end
|
39
57
|
end
|
40
58
|
end
|
@@ -28,6 +28,18 @@ class Packcr
|
|
28
28
|
erbout << "@position_offset += #{n}\n".freeze
|
29
29
|
|
30
30
|
erbout
|
31
|
+
when :rs
|
32
|
+
erbout = +""
|
33
|
+
erbout << "if self.refill_buffer(#{n}) < #{n}\n || self.input.buffer.as_bytes()[self.input.position_offset..(self.input.position_offset + #{n})] != [#{value[0, n].each_char.map { |c| "b'#{Packcr.escape_character(c)}'" }.join(", ")}]\n{\n break 'L#{format("%04d", onfail)};\n}\n".freeze
|
34
|
+
|
35
|
+
if gen.location
|
36
|
+
erbout << "TODO\n".freeze
|
37
|
+
end
|
38
|
+
erbout << "self.input.position_offset += #{n};\n".freeze
|
39
|
+
|
40
|
+
erbout
|
41
|
+
else
|
42
|
+
raise "unknown lang #{gen.lang}"
|
31
43
|
end
|
32
44
|
end
|
33
45
|
|
@@ -53,6 +65,18 @@ class Packcr
|
|
53
65
|
erbout << "@position_offset += 1\n".freeze
|
54
66
|
|
55
67
|
erbout
|
68
|
+
when :rs
|
69
|
+
erbout = +""
|
70
|
+
erbout << "if self.refill_buffer(1) < 1\n || self.input.buffer.as_bytes()[self.input.position_offset] != b'#{Packcr.escape_character(value[0])}'\n{\n break 'L#{format("%04d", onfail)};\n}\n".freeze
|
71
|
+
|
72
|
+
if gen.location
|
73
|
+
erbout << "TODO\n".freeze
|
74
|
+
end
|
75
|
+
erbout << "self.input.position_offset += 1;\n".freeze
|
76
|
+
|
77
|
+
erbout
|
78
|
+
else
|
79
|
+
raise "unknown lang #{gen.lang}"
|
56
80
|
end
|
57
81
|
end
|
58
82
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
class Packcr
|
2
2
|
class Node
|
3
3
|
class RuleNode < Packcr::Node
|
4
|
-
attr_accessor :codes, :name, :expr, :ref, :vars, :capts, :line, :col, :top
|
4
|
+
attr_accessor :codes, :name, :expr, :ref, :vars, :capts, :line, :col, :top, :has_ref
|
5
5
|
|
6
6
|
def initialize(expr = nil, name = nil, line = nil, col = nil)
|
7
7
|
super()
|
@@ -13,6 +13,7 @@ class Packcr
|
|
13
13
|
@name = name
|
14
14
|
@line = line
|
15
15
|
@col = col
|
16
|
+
@has_ref = false
|
16
17
|
end
|
17
18
|
|
18
19
|
def debug_dump(indent = 0)
|