packcr 0.0.7 → 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/LICENSE +21 -0
- data/README.md +73 -0
- data/lib/packcr/context.rb +15 -6
- data/lib/packcr/generated/context.rb +290 -143
- data/lib/packcr/generated/node/action_node.rb +19 -2
- data/lib/packcr/generated/node/alternate_node.rb +54 -8
- data/lib/packcr/generated/node/capture_node.rb +16 -1
- data/lib/packcr/generated/node/charclass_node.rb +76 -9
- data/lib/packcr/generated/node/eof_node.rb +8 -1
- data/lib/packcr/generated/node/error_node.rb +9 -2
- data/lib/packcr/generated/node/expand_node.rb +9 -2
- data/lib/packcr/generated/node/predicate_node.rb +35 -2
- data/lib/packcr/generated/node/quantity_node.rb +84 -31
- data/lib/packcr/generated/node/reference_node.rb +16 -2
- data/lib/packcr/generated/node/rule_node.rb +38 -7
- data/lib/packcr/generated/node/sequence_node.rb +18 -0
- data/lib/packcr/generated/node/string_node.rb +28 -4
- data/lib/packcr/node/reference_node.rb +1 -0
- data/lib/packcr/node/rule_node.rb +2 -1
- data/lib/packcr/parser.rb +993 -838
- data/lib/packcr/stream.rb +1 -1
- data/lib/packcr/templates/context/header.c.erb +3 -3
- data/lib/packcr/templates/context/source.c.erb +438 -420
- data/lib/packcr/templates/context/source.rb.erb +185 -167
- data/lib/packcr/templates/context/source.rs.erb +625 -0
- data/lib/packcr/templates/node/action.c.erb +2 -2
- data/lib/packcr/templates/node/action.rs.erb +6 -0
- data/lib/packcr/templates/node/alternate.c.erb +2 -2
- data/lib/packcr/templates/node/alternate.rs.erb +39 -0
- data/lib/packcr/templates/node/capture.c.erb +2 -2
- data/lib/packcr/templates/node/capture.rs.erb +13 -0
- data/lib/packcr/templates/node/charclass.c.erb +4 -4
- data/lib/packcr/templates/node/charclass_any.c.erb +2 -2
- data/lib/packcr/templates/node/charclass_one.c.erb +4 -4
- data/lib/packcr/templates/node/charclass_utf8.c.erb +2 -2
- data/lib/packcr/templates/node/charclass_utf8.rs.erb +41 -0
- data/lib/packcr/templates/node/eof.c.erb +1 -1
- data/lib/packcr/templates/node/error.c.erb +4 -4
- data/lib/packcr/templates/node/expand.c.erb +2 -2
- data/lib/packcr/templates/node/predicate.c.erb +1 -1
- data/lib/packcr/templates/node/predicate_neg.c.erb +1 -1
- data/lib/packcr/templates/node/predicate_neg.rs.erb +24 -0
- data/lib/packcr/templates/node/quantity_many.c.erb +9 -7
- data/lib/packcr/templates/node/quantity_many.rs.erb +50 -0
- data/lib/packcr/templates/node/quantity_one.c.erb +9 -7
- data/lib/packcr/templates/node/quantity_one.rb.erb +4 -4
- data/lib/packcr/templates/node/reference.c.erb +6 -6
- data/lib/packcr/templates/node/reference.rs.erb +3 -0
- data/lib/packcr/templates/node/rule.c.erb +9 -9
- 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.c.erb +2 -2
- data/lib/packcr/templates/node/string_many.rs.erb +10 -0
- data/lib/packcr/templates/node/string_one.c.erb +2 -2
- data/lib/packcr/templates/node/string_one.rs.erb +9 -0
- data/lib/packcr/util.rb +10 -1
- data/lib/packcr/version.rb +1 -1
- metadata +18 -65
@@ -5,7 +5,7 @@ class Packcr
|
|
5
5
|
case gen.lang
|
6
6
|
when :c
|
7
7
|
erbout = +""
|
8
|
-
erbout << "{\n
|
8
|
+
erbout << "{\n packcr_thunk_t *const thunk = packcr_thunk__create_leaf(ctx->auxil, packcr_action_#{gen.rule.name}_#{index}, #{gen.rule.vars.length}, #{gen.rule.capts.length});\n".freeze
|
9
9
|
|
10
10
|
vars.each do |var|
|
11
11
|
erbout << " thunk->data.leaf.values.buf[#{var.index}] = &(chunk->values.buf[#{var.index}]);\n".freeze
|
@@ -18,7 +18,7 @@ class Packcr
|
|
18
18
|
if gen.location
|
19
19
|
erbout << " thunk->data.leaf.capt0.range.start_loc = chunk->pos_loc;\n thunk->data.leaf.capt0.range.end_loc = ctx->position_offset_loc;\n".freeze
|
20
20
|
end
|
21
|
-
erbout << "
|
21
|
+
erbout << " packcr_thunk_array__add(ctx->auxil, &chunk->thunks, thunk);\n}\n".freeze
|
22
22
|
|
23
23
|
erbout
|
24
24
|
when :rb
|
@@ -53,6 +53,23 @@ class Packcr
|
|
53
53
|
erbout << " )\n)\n".freeze
|
54
54
|
|
55
55
|
erbout
|
56
|
+
when :rs
|
57
|
+
erbout = +""
|
58
|
+
erbout << "answer.push_leaf(\n Action::#{Packcr.camelize(gen.rule.name)}#{index},\n self.input.position_offset,\n &[".freeze
|
59
|
+
|
60
|
+
vars.each_with_index do |var, i|
|
61
|
+
erbout << "#{", " if i > 0}#{var.index}".freeze
|
62
|
+
end
|
63
|
+
erbout << "],\n &[".freeze
|
64
|
+
|
65
|
+
capts.each_with_index do |capt, i|
|
66
|
+
erbout << "#{", " if i > 0}#{capt.index}".freeze
|
67
|
+
end
|
68
|
+
erbout << "],\n);\n".freeze
|
69
|
+
|
70
|
+
erbout
|
71
|
+
else
|
72
|
+
raise "unknown lang #{gen.lang}"
|
56
73
|
end
|
57
74
|
end
|
58
75
|
end
|
@@ -9,7 +9,7 @@ class Packcr
|
|
9
9
|
erbout << "{\n const size_t p = ctx->position_offset;\n".freeze
|
10
10
|
|
11
11
|
if gen.location
|
12
|
-
erbout << " const
|
12
|
+
erbout << " const packcr_location_t p_loc = ctx->position_offset_loc;\n".freeze
|
13
13
|
end
|
14
14
|
erbout << " const size_t n = chunk->thunks.len;\n".freeze
|
15
15
|
|
@@ -19,13 +19,12 @@ class Packcr
|
|
19
19
|
r = expr.reachability
|
20
20
|
|
21
21
|
erbout << "#{gen.generate_code(expr, l, 4, false)}".freeze
|
22
|
-
|
23
|
-
when Packcr::CODE_REACH__ALWAYS_SUCCEED
|
22
|
+
if r == Packcr::CODE_REACH__ALWAYS_SUCCEED
|
24
23
|
if c
|
25
24
|
erbout << " /* unreachable codes omitted */\n".freeze
|
26
25
|
end
|
27
26
|
break
|
28
|
-
|
27
|
+
elsif r == Packcr::CODE_REACH__BOTH
|
29
28
|
erbout << " goto L#{format("%04d", m)};\n".freeze
|
30
29
|
end
|
31
30
|
erbout << "L#{format("%04d", l)}:;\n ctx->position_offset = p;\n".freeze
|
@@ -33,7 +32,7 @@ class Packcr
|
|
33
32
|
if gen.location
|
34
33
|
erbout << " ctx->position_offset_loc = p_loc;\n".freeze
|
35
34
|
end
|
36
|
-
erbout << "
|
35
|
+
erbout << " packcr_thunk_array__revert(ctx->auxil, &chunk->thunks, n);\n".freeze
|
37
36
|
|
38
37
|
next if c
|
39
38
|
|
@@ -64,15 +63,14 @@ class Packcr
|
|
64
63
|
r = expr.reachability
|
65
64
|
|
66
65
|
erbout << "#{gen.generate_code(expr, l, 4, false, oncut: onfail)}".freeze
|
67
|
-
|
68
|
-
when Packcr::CODE_REACH__ALWAYS_SUCCEED
|
66
|
+
if r == Packcr::CODE_REACH__ALWAYS_SUCCEED
|
69
67
|
if c
|
70
68
|
erbout << " # unreachable codes omitted\n".freeze
|
71
69
|
end
|
72
70
|
erbout << " end\n".freeze
|
73
71
|
|
74
72
|
break
|
75
|
-
|
73
|
+
elsif r == Packcr::CODE_REACH__BOTH
|
76
74
|
erbout << " throw(#{m})\n".freeze
|
77
75
|
end
|
78
76
|
erbout << " end\n".freeze
|
@@ -91,6 +89,54 @@ class Packcr
|
|
91
89
|
erbout << "end\n".freeze
|
92
90
|
|
93
91
|
erbout
|
92
|
+
when :rs
|
93
|
+
erbout = +""
|
94
|
+
m = gen.next_label
|
95
|
+
erbout << "'L#{format("%04d", m)}: {\n let p = self.input.position_offset;\n".freeze
|
96
|
+
|
97
|
+
if gen.location
|
98
|
+
erbout << " TODO\n".freeze
|
99
|
+
end
|
100
|
+
nodes.each_with_index do |expr, i|
|
101
|
+
erbout << " {\n".freeze
|
102
|
+
|
103
|
+
c = i + 1 < nodes.length
|
104
|
+
if expr.reversible?(gen)
|
105
|
+
|
106
|
+
erbout << "#{gen.generate_code(expr, m, 8, false, reverse: true, oncut: onfail)}".freeze
|
107
|
+
else
|
108
|
+
l = gen.next_label
|
109
|
+
erbout << " 'L#{format("%04d", l)}: {\n".freeze
|
110
|
+
|
111
|
+
r = expr.reachability
|
112
|
+
|
113
|
+
erbout << "#{gen.generate_code(expr, l, 12, false, oncut: onfail)}".freeze
|
114
|
+
if r == Packcr::CODE_REACH__ALWAYS_SUCCEED
|
115
|
+
if c
|
116
|
+
erbout << " // unreachable codes omitted\n".freeze
|
117
|
+
end
|
118
|
+
erbout << " }\n".freeze
|
119
|
+
|
120
|
+
break
|
121
|
+
elsif r == Packcr::CODE_REACH__BOTH
|
122
|
+
erbout << " break 'L#{format("%04d", m)};\n".freeze
|
123
|
+
end
|
124
|
+
erbout << " }\n".freeze
|
125
|
+
end
|
126
|
+
erbout << " }\n self.input.position_offset = p;\n".freeze
|
127
|
+
|
128
|
+
if gen.location
|
129
|
+
erbout << " TODO\n".freeze
|
130
|
+
end
|
131
|
+
next if c
|
132
|
+
|
133
|
+
erbout << " break 'L#{format("%04d", onfail)};\n".freeze
|
134
|
+
end
|
135
|
+
erbout << "} // 'L#{format("%04d", m)}\n".freeze
|
136
|
+
|
137
|
+
erbout
|
138
|
+
else
|
139
|
+
raise "unknown lang #{gen.lang}"
|
94
140
|
end
|
95
141
|
end
|
96
142
|
end
|
@@ -8,7 +8,7 @@ class Packcr
|
|
8
8
|
erbout << "{\n const size_t p = ctx->position_offset;\n size_t q;\n".freeze
|
9
9
|
|
10
10
|
if gen.location
|
11
|
-
erbout << "
|
11
|
+
erbout << " packcr_location_t p_loc = ctx->position_offset_loc;\n packcr_location_t q_loc;\n".freeze
|
12
12
|
end
|
13
13
|
erbout << "#{gen.generate_code(expr, onfail, 4, false)} q = ctx->position_offset;\n chunk->capts.buf[#{index}].range.start = p;\n chunk->capts.buf[#{index}].range.end = q;\n".freeze
|
14
14
|
|
@@ -32,6 +32,21 @@ class Packcr
|
|
32
32
|
erbout << "q_loc#{gen.level} = @position_offset_loc\ncapt#{gen.level}.start_loc = p_loc#{gen.level}\ncapt#{gen.level}.end_loc = q_loc#{gen.level}\n".freeze
|
33
33
|
end
|
34
34
|
erbout
|
35
|
+
when :rs
|
36
|
+
erbout = +""
|
37
|
+
erbout << "let p_inner = self.input.position_offset;\n".freeze
|
38
|
+
|
39
|
+
if gen.location
|
40
|
+
erbout << "TODO\n".freeze
|
41
|
+
end
|
42
|
+
erbout << "{\n#{gen.generate_code(expr, onfail, 4, false)}}\nlet q = self.input.position_offset;\nanswer.capts[#{index}].start = p_inner;\nanswer.capts[#{index}].end = q;\n".freeze
|
43
|
+
|
44
|
+
if gen.location
|
45
|
+
erbout << "TODO\n".freeze
|
46
|
+
end
|
47
|
+
erbout
|
48
|
+
else
|
49
|
+
raise "unknown lang #{gen.lang}"
|
35
50
|
end
|
36
51
|
end
|
37
52
|
end
|
@@ -5,7 +5,7 @@ class Packcr
|
|
5
5
|
case gen.lang
|
6
6
|
when :c
|
7
7
|
erbout = +""
|
8
|
-
erbout << "{\n char c;\n if (
|
8
|
+
erbout << "{\n char c;\n if (packcr_refill_buffer(ctx, 1) < 1) goto L#{format("%04d", onfail)};\n c = ctx->buffer.buf[ctx->position_offset];\n".freeze
|
9
9
|
if !a && charclass =~ /\A[^\\]-.\z/
|
10
10
|
|
11
11
|
if a
|
@@ -45,7 +45,7 @@ class Packcr
|
|
45
45
|
end
|
46
46
|
end
|
47
47
|
if gen.location
|
48
|
-
erbout << "
|
48
|
+
erbout << " packcr_location_forward(&ctx->position_offset_loc, ctx->buffer.buf + ctx->position_offset, 1);\n".freeze
|
49
49
|
end
|
50
50
|
erbout << " ctx->position_offset++;\n}\n".freeze
|
51
51
|
|
@@ -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
|
|
@@ -99,10 +101,10 @@ class Packcr
|
|
99
101
|
case gen.lang
|
100
102
|
when :c
|
101
103
|
erbout = +""
|
102
|
-
erbout << "if (
|
104
|
+
erbout << "if (packcr_refill_buffer(ctx, 1) < 1) goto L#{format("%04d", onfail)};\n".freeze
|
103
105
|
|
104
106
|
if gen.location
|
105
|
-
erbout << "
|
107
|
+
erbout << "packcr_location_forward(&ctx->position_offset, ctx->buffer.buf + ctx->position_offset, 1);\n".freeze
|
106
108
|
end
|
107
109
|
erbout << "ctx->position_offset++;\n".freeze
|
108
110
|
|
@@ -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
|
|
@@ -140,14 +146,14 @@ class Packcr
|
|
140
146
|
when :c
|
141
147
|
erbout = +""
|
142
148
|
if a
|
143
|
-
erbout << "if (\n
|
149
|
+
erbout << "if (\n packcr_refill_buffer(ctx, 1) < 1 ||\n ctx->buffer.buf[ctx->position_offset] == '#{Packcr.escape_character(charclass[i])}'\n) goto L#{format("%04d", onfail)};\n".freeze
|
144
150
|
|
145
151
|
else
|
146
|
-
erbout << "if (\n
|
152
|
+
erbout << "if (\n packcr_refill_buffer(ctx, 1) < 1 ||\n ctx->buffer.buf[ctx->position_offset] != '#{Packcr.escape_character(charclass[0])}'\n) goto L#{format("%04d", onfail)};\n".freeze
|
147
153
|
|
148
154
|
end
|
149
155
|
if gen.location
|
150
|
-
erbout << "
|
156
|
+
erbout << " packcr_location_forward(&ctx->position_offset_loc, ctx->buffer.buf + ctx->position_offset, 1);\n".freeze
|
151
157
|
end
|
152
158
|
erbout << "ctx->position_offset++;\n".freeze
|
153
159
|
erbout
|
@@ -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
|
|
@@ -174,7 +182,7 @@ class Packcr
|
|
174
182
|
erbout = +""
|
175
183
|
a = charclass && charclass[0] == "^"
|
176
184
|
i = a ? 1 : 0
|
177
|
-
erbout << "{\n int u;\n const size_t n =
|
185
|
+
erbout << "{\n int u;\n const size_t n = packcr_get_char_as_utf32(ctx, &u);\n if (n == 0) goto L#{format("%04d", onfail)};\n".freeze
|
178
186
|
|
179
187
|
if charclass && !(a && n == 1) # not '.' or '[^]'
|
180
188
|
u0 = 0
|
@@ -227,7 +235,7 @@ class Packcr
|
|
227
235
|
end
|
228
236
|
end
|
229
237
|
if gen.location
|
230
|
-
erbout << "
|
238
|
+
erbout << " packcr_location_forward(&ctx->position_offset_loc, ctx->buffer.buf + ctx->position_offset, n);\n".freeze
|
231
239
|
end
|
232
240
|
erbout << " ctx->position_offset += n;\n}\n".freeze
|
233
241
|
|
@@ -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
|
@@ -5,7 +5,7 @@ class Packcr
|
|
5
5
|
case gen.lang
|
6
6
|
when :c
|
7
7
|
erbout = +""
|
8
|
-
erbout << "if (
|
8
|
+
erbout << "if (packcr_refill_buffer(ctx, 1) >= 1) goto L#{format("%04d", onfail)};\n".freeze
|
9
9
|
|
10
10
|
erbout
|
11
11
|
when :rb
|
@@ -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
|
@@ -10,7 +10,7 @@ class Packcr
|
|
10
10
|
l = gen.next_label
|
11
11
|
m = gen.next_label
|
12
12
|
|
13
|
-
erbout << "#{gen.generate_code(expr, l, 4, true)} goto L#{format("%04d", m)};\nL#{format("%04d", l)}:;\n {\n
|
13
|
+
erbout << "#{gen.generate_code(expr, l, 4, true)} goto L#{format("%04d", m)};\nL#{format("%04d", l)}:;\n {\n packcr_value_t null;\n packcr_thunk_t *const thunk = packcr_thunk__create_leaf(ctx->auxil, packcr_action_#{gen.rule.name}_#{index}, #{gen.rule.vars.length}, #{gen.rule.capts.length});\n".freeze
|
14
14
|
|
15
15
|
vars.each do |var|
|
16
16
|
erbout << " thunk->data.leaf.values.buf[#{var.index}] = &(chunk->values.buf[#{var.index}]);\n".freeze
|
@@ -23,7 +23,7 @@ class Packcr
|
|
23
23
|
if gen.location
|
24
24
|
erbout << " thunk->data.leaf.capt0.range.start_loc = chunk->pos_loc;\n thunk->data.leaf.capt0.range.end_loc = ctx->position_offset_loc;\n".freeze
|
25
25
|
end
|
26
|
-
erbout << " memset(&null, 0, sizeof(
|
26
|
+
erbout << " memset(&null, 0, sizeof(packcr_value_t)); /* in case */\n thunk->data.leaf.action(ctx, thunk, &null);\n packcr_thunk__destroy(ctx->auxil, thunk);\n }\n goto L#{format("%04d", onfail)};\nL#{format("%04d", m)}:;\n}\n".freeze
|
27
27
|
|
28
28
|
erbout
|
29
29
|
when :rb
|
@@ -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
|
@@ -5,10 +5,10 @@ class Packcr
|
|
5
5
|
case gen.lang
|
6
6
|
when :c
|
7
7
|
erbout = +""
|
8
|
-
erbout << "{\n const size_t n = chunk->capts.buf[#{index}].range.end - chunk->capts.buf[#{index}].range.start;\n if (
|
8
|
+
erbout << "{\n const size_t n = chunk->capts.buf[#{index}].range.end - chunk->capts.buf[#{index}].range.start;\n if (packcr_refill_buffer(ctx, n) < n) goto L#{format("%04d", onfail)};\n if (n > 0) {\n const char *const p = ctx->buffer.buf + ctx->position_offset;\n const char *const q = ctx->buffer.buf + chunk->capts.buf[#{index}].range.start;\n size_t i;\n for (i = 0; i < n; i++) {\n if (p[i] != q[i]) goto L#{format("%04d", onfail)};\n }\n".freeze
|
9
9
|
|
10
10
|
if gen.location
|
11
|
-
erbout << "
|
11
|
+
erbout << " packcr_location_forward(&ctx->position_offset_loc, ctx->buffer.buf + ctx->position_offset, n);\n".freeze
|
12
12
|
end
|
13
13
|
erbout << " ctx->position_offset += n;\n }\n}\n".freeze
|
14
14
|
|
@@ -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
|
@@ -11,7 +11,7 @@ class Packcr
|
|
11
11
|
erbout << "{\n const size_t p = ctx->position_offset;\n".freeze
|
12
12
|
|
13
13
|
if gen.location
|
14
|
-
erbout << " const
|
14
|
+
erbout << " const packcr_location_t p_loc = ctx->position_offset_loc;\n".freeze
|
15
15
|
end
|
16
16
|
erbout << "#{gen.generate_code(expr, l, 4, false)}".freeze
|
17
17
|
if r != Packcr::CODE_REACH__ALWAYS_FAIL
|
@@ -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
|
|
@@ -84,7 +86,7 @@ class Packcr
|
|
84
86
|
erbout << "{\n const size_t p = ctx->position_offset;\n".freeze
|
85
87
|
|
86
88
|
if gen.location
|
87
|
-
erbout << " const
|
89
|
+
erbout << " const packcr_location_t p_loc = ctx->position_offset_loc;\n".freeze
|
88
90
|
end
|
89
91
|
erbout << "#{gen.generate_code(expr, l, 4, false)}".freeze
|
90
92
|
if r != Packcr::CODE_REACH__ALWAYS_FAIL
|
@@ -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
|