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.
Files changed (59) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE +21 -0
  3. data/README.md +73 -0
  4. data/lib/packcr/context.rb +15 -6
  5. data/lib/packcr/generated/context.rb +290 -143
  6. data/lib/packcr/generated/node/action_node.rb +19 -2
  7. data/lib/packcr/generated/node/alternate_node.rb +54 -8
  8. data/lib/packcr/generated/node/capture_node.rb +16 -1
  9. data/lib/packcr/generated/node/charclass_node.rb +76 -9
  10. data/lib/packcr/generated/node/eof_node.rb +8 -1
  11. data/lib/packcr/generated/node/error_node.rb +9 -2
  12. data/lib/packcr/generated/node/expand_node.rb +9 -2
  13. data/lib/packcr/generated/node/predicate_node.rb +35 -2
  14. data/lib/packcr/generated/node/quantity_node.rb +84 -31
  15. data/lib/packcr/generated/node/reference_node.rb +16 -2
  16. data/lib/packcr/generated/node/rule_node.rb +38 -7
  17. data/lib/packcr/generated/node/sequence_node.rb +18 -0
  18. data/lib/packcr/generated/node/string_node.rb +28 -4
  19. data/lib/packcr/node/reference_node.rb +1 -0
  20. data/lib/packcr/node/rule_node.rb +2 -1
  21. data/lib/packcr/parser.rb +993 -838
  22. data/lib/packcr/stream.rb +1 -1
  23. data/lib/packcr/templates/context/header.c.erb +3 -3
  24. data/lib/packcr/templates/context/source.c.erb +438 -420
  25. data/lib/packcr/templates/context/source.rb.erb +185 -167
  26. data/lib/packcr/templates/context/source.rs.erb +625 -0
  27. data/lib/packcr/templates/node/action.c.erb +2 -2
  28. data/lib/packcr/templates/node/action.rs.erb +6 -0
  29. data/lib/packcr/templates/node/alternate.c.erb +2 -2
  30. data/lib/packcr/templates/node/alternate.rs.erb +39 -0
  31. data/lib/packcr/templates/node/capture.c.erb +2 -2
  32. data/lib/packcr/templates/node/capture.rs.erb +13 -0
  33. data/lib/packcr/templates/node/charclass.c.erb +4 -4
  34. data/lib/packcr/templates/node/charclass_any.c.erb +2 -2
  35. data/lib/packcr/templates/node/charclass_one.c.erb +4 -4
  36. data/lib/packcr/templates/node/charclass_utf8.c.erb +2 -2
  37. data/lib/packcr/templates/node/charclass_utf8.rs.erb +41 -0
  38. data/lib/packcr/templates/node/eof.c.erb +1 -1
  39. data/lib/packcr/templates/node/error.c.erb +4 -4
  40. data/lib/packcr/templates/node/expand.c.erb +2 -2
  41. data/lib/packcr/templates/node/predicate.c.erb +1 -1
  42. data/lib/packcr/templates/node/predicate_neg.c.erb +1 -1
  43. data/lib/packcr/templates/node/predicate_neg.rs.erb +24 -0
  44. data/lib/packcr/templates/node/quantity_many.c.erb +9 -7
  45. data/lib/packcr/templates/node/quantity_many.rs.erb +50 -0
  46. data/lib/packcr/templates/node/quantity_one.c.erb +9 -7
  47. data/lib/packcr/templates/node/quantity_one.rb.erb +4 -4
  48. data/lib/packcr/templates/node/reference.c.erb +6 -6
  49. data/lib/packcr/templates/node/reference.rs.erb +3 -0
  50. data/lib/packcr/templates/node/rule.c.erb +9 -9
  51. data/lib/packcr/templates/node/rule.rs.erb +34 -0
  52. data/lib/packcr/templates/node/sequence.rs.erb +12 -0
  53. data/lib/packcr/templates/node/string_many.c.erb +2 -2
  54. data/lib/packcr/templates/node/string_many.rs.erb +10 -0
  55. data/lib/packcr/templates/node/string_one.c.erb +2 -2
  56. data/lib/packcr/templates/node/string_one.rs.erb +9 -0
  57. data/lib/packcr/util.rb +10 -1
  58. data/lib/packcr/version.rb +1 -1
  59. metadata +18 -65
@@ -7,11 +7,12 @@ class Packcr
7
7
  erbout = +""
8
8
  erbout << "{\n".freeze
9
9
 
10
+ r = expr.reachability
10
11
  if min > 0
11
12
  erbout << " const size_t p0 = ctx->position_offset;\n".freeze
12
13
 
13
14
  if gen.location
14
- erbout << " const pcc_location_t p0_loc = ctx->position_offset_loc;\n".freeze
15
+ erbout << " const packcr_location_t p0_loc = ctx->position_offset_loc;\n".freeze
15
16
  end
16
17
  erbout << " const size_t n0 = chunk->thunks.len;\n".freeze
17
18
  end
@@ -25,13 +26,13 @@ class Packcr
25
26
  end
26
27
  erbout << " const size_t p = ctx->position_offset;\n".freeze
27
28
 
28
- if gen.location
29
- erbout << " const pcc_location_t p_loc = ctx->position_offset_loc;\n".freeze
29
+ if r != Packcr::CODE_REACH__ALWAYS_SUCCEED
30
+ if gen.location
31
+ erbout << " const packcr_location_t p_loc = ctx->position_offset_loc;\n".freeze
32
+ end
33
+ erbout << " const size_t n = chunk->thunks.len;\n".freeze
30
34
  end
31
- erbout << " const size_t n = chunk->thunks.len;\n".freeze
32
-
33
35
  l = gen.next_label
34
- r = expr.reachability
35
36
  erbout << "#{gen.generate_code(expr, l, 8, false)} if (ctx->position_offset == p) break;\n".freeze
36
37
 
37
38
  if r != Packcr::CODE_REACH__ALWAYS_SUCCEED
@@ -40,7 +41,7 @@ class Packcr
40
41
  if gen.location
41
42
  erbout << " ctx->position_offset_loc = p_loc;\n".freeze
42
43
  end
43
- erbout << " pcc_thunk_array__revert(ctx->auxil, &chunk->thunks, n);\n break;\n".freeze
44
+ erbout << " packcr_thunk_array__revert(ctx->auxil, &chunk->thunks, n);\n break;\n".freeze
44
45
  end
45
46
  erbout << " }\n".freeze
46
47
 
@@ -50,7 +51,7 @@ class Packcr
50
51
  if gen.location
51
52
  erbout << " ctx->position_offset_loc = p0_loc;\n".freeze
52
53
  end
53
- erbout << " pcc_thunk_array__revert(ctx->auxil, &chunk->thunks, n0);\n goto L#{format("%04d", onfail)};\n }\n".freeze
54
+ erbout << " packcr_thunk_array__revert(ctx->auxil, &chunk->thunks, n0);\n goto L#{format("%04d", onfail)};\n }\n".freeze
54
55
  end
55
56
  erbout << "}\n".freeze
56
57
 
@@ -105,6 +106,58 @@ class Packcr
105
106
  erbout << " answer.thunks[m#{gen.level}..-1] = []\n throw(#{onfail})\nend\n".freeze
106
107
  end
107
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}"
108
161
  end
109
162
  end
110
163
 
@@ -112,45 +165,43 @@ class Packcr
112
165
  case gen.lang
113
166
  when :c
114
167
  erbout = +""
115
- erbout << "{\n".freeze
116
-
117
- l = gen.next_label
118
- erbout << " const size_t p = ctx->position_offset;\n".freeze
168
+ r = expr.reachability
169
+ if r == Packcr::CODE_REACH__ALWAYS_SUCCEED
170
+ erbout << "#{gen.generate_code(expr, nil, 0, true)}".freeze
171
+ else
172
+ erbout << "{\n".freeze
119
173
 
120
- if gen.location
121
- erbout << " const pcc_location_t p_loc = ctx->position_offset_loc;\n".freeze
122
- end
123
- erbout << " const size_t n = chunk->thunks.len;\n".freeze
174
+ l = gen.next_label
175
+ erbout << " const size_t p = ctx->position_offset;\n".freeze
124
176
 
125
- r = expr.reachability
126
- erbout << "#{gen.generate_code(expr, l, 4, false)}".freeze
127
- if r != Packcr::CODE_REACH__ALWAYS_SUCCEED
177
+ if gen.location
178
+ erbout << " const packcr_location_t p_loc = ctx->position_offset_loc;\n".freeze
179
+ end
180
+ erbout << " const size_t n = chunk->thunks.len;\n#{gen.generate_code(expr, l, 4, false)}".freeze
128
181
  m = gen.next_label
129
182
  erbout << " goto L#{format("%04d", m)};\nL#{format("%04d", l)}:;\n".freeze
130
183
 
131
184
  if gen.location
132
185
  erbout << " ctx->position_offset_loc = p_loc;\n".freeze
133
186
  end
134
- erbout << " ctx->position_offset = p;\n pcc_thunk_array__revert(ctx->auxil, &chunk->thunks, n);\nL#{format("%04d", m)}:;\n".freeze
187
+ erbout << " ctx->position_offset = p;\n packcr_thunk_array__revert(ctx->auxil, &chunk->thunks, n);\nL#{format("%04d", m)}:;\n}\n".freeze
135
188
  end
136
- erbout << "}\n".freeze
137
-
138
189
  erbout
139
190
  when :rb
140
191
  erbout = +""
141
- l = gen.next_label
142
- erbout << "pos#{gen.level} = @position_offset\n".freeze
143
-
144
- if gen.location
145
- erbout << "p_loc#{gen.level} = @position_offset_loc\n".freeze
146
- end
147
- erbout << "n#{gen.level} = answer.thunks.length\n".freeze
148
-
149
192
  r = expr.reachability
150
193
  if r == Packcr::CODE_REACH__ALWAYS_SUCCEED
151
194
 
152
- erbout << "#{gen.generate_code(expr, l, 0, false)}".freeze
195
+ erbout << "#{gen.generate_code(expr, nil, 0, true)}".freeze
153
196
  else
197
+ l = gen.next_label
198
+ erbout << "pos#{gen.level} = @position_offset\n".freeze
199
+
200
+ if gen.location
201
+ erbout << "p_loc#{gen.level} = @position_offset_loc\n".freeze
202
+ end
203
+ erbout << "n#{gen.level} = answer.thunks.length\n".freeze
204
+
154
205
  m = gen.next_label
155
206
  erbout << "catch(#{m}) do\n catch(#{l}) do\n#{gen.generate_code(expr, l, 4, false)} throw(#{m})\n end\n".freeze
156
207
 
@@ -160,6 +211,8 @@ class Packcr
160
211
  erbout << " @position_offset = pos#{gen.level}\n answer.thunks[n#{gen.level}..-1] = []\nend\n".freeze
161
212
  end
162
213
  erbout
214
+ else
215
+ raise "unknown lang #{gen.lang}"
163
216
  end
164
217
  end
165
218
  end
@@ -6,9 +6,9 @@ class Packcr
6
6
  when :c
7
7
  erbout = +""
8
8
  if index.nil?
9
- erbout << "{\n pcc_rule_set_t *l = NULL;\n if (limits && ctx->position_offset == offset && pcc_rule_set__index(ctx->auxil, limits, pcc_evaluate_rule_#{name}) == PCC_VOID_VALUE) {\n l = limits;\n }\n if (!pcc_apply_rule(ctx, pcc_evaluate_rule_#{name}, &chunk->thunks, NULL, offset".freeze
9
+ erbout << "{\n packcr_rule_set_t *l = NULL;\n if (limits && ctx->position_offset == offset && packcr_rule_set__index(ctx->auxil, limits, packcr_evaluate_rule_#{name}) == PACKCR_VOID_VALUE) {\n l = limits;\n }\n if (!packcr_apply_rule(ctx, packcr_evaluate_rule_#{name}, &chunk->thunks, NULL, offset".freeze
10
10
  else
11
- erbout << "{\n pcc_rule_set_t *l = NULL;\n if (limits && ctx->position_offset == offset && pcc_rule_set__index(ctx->auxil, limits, pcc_evaluate_rule_#{name}) == PCC_VOID_VALUE) {\n l = limits;\n }\n if (!pcc_apply_rule(ctx, pcc_evaluate_rule_#{name}, &chunk->thunks, &(chunk->values.buf[#{index}]), offset".freeze
11
+ erbout << "{\n packcr_rule_set_t *l = NULL;\n if (limits && ctx->position_offset == offset && packcr_rule_set__index(ctx->auxil, limits, packcr_evaluate_rule_#{name}) == PACKCR_VOID_VALUE) {\n l = limits;\n }\n if (!packcr_apply_rule(ctx, packcr_evaluate_rule_#{name}, &chunk->thunks, &(chunk->values.buf[#{index}]), offset".freeze
12
12
 
13
13
  end
14
14
  if gen.location
@@ -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
@@ -5,26 +5,26 @@ class Packcr
5
5
  case gen.lang
6
6
  when :c
7
7
  erbout = +""
8
- erbout << "static pcc_thunk_chunk_t *pcc_evaluate_rule_#{name}(pcc_context_t *ctx, size_t offset".freeze
8
+ erbout << "static packcr_thunk_chunk_t *packcr_evaluate_rule_#{name}(packcr_context_t *ctx, size_t offset".freeze
9
9
  if gen.location
10
- erbout << ", pcc_location_t offset_loc".freeze
10
+ erbout << ", packcr_location_t offset_loc".freeze
11
11
  end
12
- erbout << ", pcc_rule_set_t *limits) {\n pcc_thunk_chunk_t *const chunk = pcc_thunk_chunk__create(ctx);\n chunk->pos = ctx->position_offset;\n".freeze
12
+ erbout << ", packcr_rule_set_t *limits) {\n packcr_thunk_chunk_t *const chunk = packcr_thunk_chunk__create(ctx);\n chunk->pos = ctx->position_offset;\n".freeze
13
13
 
14
14
  if gen.location
15
15
  erbout << " chunk->pos_loc = ctx->position_offset_loc;\n".freeze
16
16
  end
17
- erbout << " PCC_DEBUG(ctx->auxil, PCC_DBG_EVALUATE, \"#{name}\", ctx->level, chunk->pos, (ctx->buffer.buf + chunk->pos), (ctx->buffer.len - chunk->pos));\n ctx->level++;\n pcc_value_table__resize(ctx->auxil, &chunk->values, #{vars.length});\n pcc_capture_table__resize(ctx->auxil, &chunk->capts, #{capts.length});\n".freeze
17
+ erbout << " PACKCR_DEBUG(ctx->auxil, PACKCR_DBG_EVALUATE, \"#{name}\", ctx->level, chunk->pos, (ctx->buffer.buf + chunk->pos), (ctx->buffer.len - chunk->pos));\n ctx->level++;\n packcr_value_table__resize(ctx->auxil, &chunk->values, #{vars.length});\n packcr_capture_table__resize(ctx->auxil, &chunk->capts, #{capts.length});\n".freeze
18
18
 
19
19
  if !vars.empty?
20
- erbout << " pcc_value_table__clear(ctx->auxil, &chunk->values);\n".freeze
20
+ erbout << " packcr_value_table__clear(ctx->auxil, &chunk->values);\n".freeze
21
21
  end
22
22
  r = expr.reachability
23
23
 
24
- erbout << "#{gen.generate_code(expr, 0, 4, false)} ctx->level--;\n PCC_DEBUG(ctx->auxil, PCC_DBG_MATCH, \"#{name}\", ctx->level, chunk->pos, (ctx->buffer.buf + chunk->pos), (ctx->position_offset - chunk->pos));\n return chunk;\n".freeze
24
+ erbout << "#{gen.generate_code(expr, 0, 4, false)} ctx->level--;\n PACKCR_DEBUG(ctx->auxil, PACKCR_DBG_MATCH, \"#{name}\", ctx->level, chunk->pos, (ctx->buffer.buf + chunk->pos), (ctx->position_offset - chunk->pos));\n return chunk;\n".freeze
25
25
 
26
26
  if r != Packcr::CODE_REACH__ALWAYS_SUCCEED
27
- erbout << "L0000:;\n ctx->level--;\n PCC_DEBUG(ctx->auxil, PCC_DBG_NOMATCH, \"#{name}\", ctx->level, chunk->pos, (ctx->buffer.buf + chunk->pos), (ctx->position_offset - chunk->pos));\n pcc_thunk_chunk__destroy(ctx, chunk);\n return NULL;\n".freeze
27
+ erbout << "L0000:;\n ctx->level--;\n PACKCR_DEBUG(ctx->auxil, PACKCR_DBG_NOMATCH, \"#{name}\", ctx->level, chunk->pos, (ctx->buffer.buf + chunk->pos), (ctx->position_offset - chunk->pos));\n packcr_thunk_chunk__destroy(ctx, chunk);\n return NULL;\n".freeze
28
28
  end
29
29
  erbout << "}\n".freeze
30
30
 
@@ -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
@@ -5,7 +5,7 @@ class Packcr
5
5
  case gen.lang
6
6
  when :c
7
7
  erbout = +""
8
- erbout << "if (\n pcc_refill_buffer(ctx, #{n}) < #{n} ||\n".freeze
8
+ erbout << "if (\n packcr_refill_buffer(ctx, #{n}) < #{n} ||\n".freeze
9
9
 
10
10
  (n - 1).times do |i|
11
11
  erbout << " (ctx->buffer.buf + ctx->position_offset)[#{i}] != '#{Packcr.escape_character(value[i])}' ||\n".freeze
@@ -13,7 +13,7 @@ class Packcr
13
13
  erbout << " (ctx->buffer.buf + ctx->position_offset)[#{n - 1}] != '#{Packcr.escape_character(value[n - 1])}'\n) goto L#{format("%04d", onfail)};\n".freeze
14
14
 
15
15
  if gen.location
16
- erbout << "pcc_location_forward(&ctx->position_offset_loc, ctx->buffer.buf + ctx->position_offset, n);\n".freeze
16
+ erbout << "packcr_location_forward(&ctx->position_offset_loc, ctx->buffer.buf + ctx->position_offset, #{n});\n".freeze
17
17
  end
18
18
  erbout << "ctx->position_offset += #{n};\n".freeze
19
19
 
@@ -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
 
@@ -35,10 +47,10 @@ class Packcr
35
47
  case gen.lang
36
48
  when :c
37
49
  erbout = +""
38
- erbout << "if (\n pcc_refill_buffer(ctx, 1) < 1 ||\n ctx->buffer.buf[ctx->position_offset] != '#{Packcr.escape_character(value[0])}'\n) goto L#{format("%04d", onfail)};\n".freeze
50
+ erbout << "if (\n packcr_refill_buffer(ctx, 1) < 1 ||\n ctx->buffer.buf[ctx->position_offset] != '#{Packcr.escape_character(value[0])}'\n) goto L#{format("%04d", onfail)};\n".freeze
39
51
 
40
52
  if gen.location
41
- erbout << " pcc_location_forward(&ctx->position_offset_loc, ctx->buffer.buf + ctx->position_offset, 1);\n".freeze
53
+ erbout << " packcr_location_forward(&ctx->position_offset_loc, ctx->buffer.buf + ctx->position_offset, 1);\n".freeze
42
54
  end
43
55
  erbout << "ctx->position_offset++;\n".freeze
44
56
 
@@ -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
@@ -33,6 +33,7 @@ class Packcr
33
33
  end
34
34
 
35
35
  def setup_rule(rule)
36
+ rule.has_ref = true
36
37
  return unless var
37
38
 
38
39
  i = rule.vars.index do |ref|
@@ -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)