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.
Files changed (37) hide show
  1. checksums.yaml +4 -4
  2. data/lib/packcr/context.rb +14 -5
  3. data/lib/packcr/generated/context.rb +189 -85
  4. data/lib/packcr/generated/node/action_node.rb +17 -0
  5. data/lib/packcr/generated/node/alternate_node.rb +52 -6
  6. data/lib/packcr/generated/node/capture_node.rb +15 -0
  7. data/lib/packcr/generated/node/charclass_node.rb +67 -0
  8. data/lib/packcr/generated/node/eof_node.rb +7 -0
  9. data/lib/packcr/generated/node/error_node.rb +7 -0
  10. data/lib/packcr/generated/node/expand_node.rb +7 -0
  11. data/lib/packcr/generated/node/predicate_node.rb +33 -0
  12. data/lib/packcr/generated/node/quantity_node.rb +54 -0
  13. data/lib/packcr/generated/node/reference_node.rb +14 -0
  14. data/lib/packcr/generated/node/rule_node.rb +31 -0
  15. data/lib/packcr/generated/node/sequence_node.rb +18 -0
  16. data/lib/packcr/generated/node/string_node.rb +24 -0
  17. data/lib/packcr/node/reference_node.rb +1 -0
  18. data/lib/packcr/node/rule_node.rb +2 -1
  19. data/lib/packcr/parser.rb +403 -254
  20. data/lib/packcr/stream.rb +1 -1
  21. data/lib/packcr/templates/context/source.c.erb +30 -26
  22. data/lib/packcr/templates/context/source.rb.erb +160 -159
  23. data/lib/packcr/templates/context/source.rs.erb +625 -0
  24. data/lib/packcr/templates/node/action.rs.erb +6 -0
  25. data/lib/packcr/templates/node/alternate.rs.erb +39 -0
  26. data/lib/packcr/templates/node/capture.rs.erb +13 -0
  27. data/lib/packcr/templates/node/charclass_utf8.rs.erb +41 -0
  28. data/lib/packcr/templates/node/predicate_neg.rs.erb +24 -0
  29. data/lib/packcr/templates/node/quantity_many.rs.erb +50 -0
  30. data/lib/packcr/templates/node/reference.rs.erb +3 -0
  31. data/lib/packcr/templates/node/rule.rs.erb +34 -0
  32. data/lib/packcr/templates/node/sequence.rs.erb +12 -0
  33. data/lib/packcr/templates/node/string_many.rs.erb +10 -0
  34. data/lib/packcr/templates/node/string_one.rs.erb +9 -0
  35. data/lib/packcr/util.rb +9 -0
  36. data/lib/packcr/version.rb +1 -1
  37. 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
@@ -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)