packcr 0.1.0 → 0.1.1

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 (45) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/lib/packcr/generated/context.rb +8 -13
  4. data/lib/packcr/generated/node/action_node.rb +4 -6
  5. data/lib/packcr/generated/node/alternate_node.rb +11 -17
  6. data/lib/packcr/generated/node/capture_node.rb +1 -1
  7. data/lib/packcr/generated/node/charclass_node.rb +8 -8
  8. data/lib/packcr/generated/node/eof_node.rb +1 -1
  9. data/lib/packcr/generated/node/error_node.rb +1 -1
  10. data/lib/packcr/generated/node/expand_node.rb +1 -1
  11. data/lib/packcr/generated/node/predicate_node.rb +9 -7
  12. data/lib/packcr/generated/node/quantity_node.rb +16 -16
  13. data/lib/packcr/generated/node/reference_node.rb +3 -8
  14. data/lib/packcr/generated/node/rule_node.rb +6 -6
  15. data/lib/packcr/generated/node/sequence_node.rb +1 -1
  16. data/lib/packcr/generated/node/string_node.rb +28 -4
  17. data/lib/packcr/generator.rb +4 -3
  18. data/lib/packcr/node/action_node.rb +2 -2
  19. data/lib/packcr/node/alternate_node.rb +2 -2
  20. data/lib/packcr/node/capture_node.rb +2 -2
  21. data/lib/packcr/node/charclass_node.rb +15 -15
  22. data/lib/packcr/node/eof_node.rb +2 -2
  23. data/lib/packcr/node/error_node.rb +2 -2
  24. data/lib/packcr/node/expand_node.rb +2 -2
  25. data/lib/packcr/node/predicate_node.rb +3 -3
  26. data/lib/packcr/node/quantity_node.rb +4 -4
  27. data/lib/packcr/node/reference_node.rb +4 -4
  28. data/lib/packcr/node/rule_node.rb +2 -2
  29. data/lib/packcr/node/sequence_node.rb +2 -2
  30. data/lib/packcr/node/string_node.rb +17 -3
  31. data/lib/packcr/parser.rb +1 -1
  32. data/lib/packcr/templates/context/source.rs.erb +93 -91
  33. data/lib/packcr/templates/node/action.rs.erb +5 -5
  34. data/lib/packcr/templates/node/alternate.rs.erb +28 -29
  35. data/lib/packcr/templates/node/charclass_utf8.rs.erb +3 -3
  36. data/lib/packcr/templates/node/predicate_neg.rs.erb +6 -6
  37. data/lib/packcr/templates/node/quantity_many.rs.erb +55 -28
  38. data/lib/packcr/templates/node/reference.rs.erb +2 -2
  39. data/lib/packcr/templates/node/rule.rs.erb +20 -11
  40. data/lib/packcr/templates/node/string_many.rs.erb +4 -4
  41. data/lib/packcr/templates/node/string_many_reverse.rs.erb +7 -0
  42. data/lib/packcr/templates/node/string_one.rs.erb +3 -3
  43. data/lib/packcr/templates/node/string_one_reverse.rs.erb +6 -0
  44. data/lib/packcr/version.rb +1 -1
  45. metadata +6 -4
@@ -1,39 +1,38 @@
1
- <%- m = gen.next_label -%>
2
- 'L<%= format("%04d", m) %>: {
1
+ <%- m = gen.next_label -%>
2
+ catch(<%= m %>, || {
3
3
  let p = self.input.position_offset;
4
4
  <%- if gen.location -%>
5
5
  TODO
6
6
  <%- end -%>
7
7
  <%- nodes.each_with_index do |expr, i| -%>
8
- {
9
- <%- c = i + 1 < nodes.length -%>
10
- <%- if expr.reversible?(gen) -%>
11
- <%- %><%= gen.generate_code(expr, m, 8, false, reverse: true, oncut: onfail) -%>
12
- <%- else -%>
13
- <%- l = gen.next_label -%>
14
- 'L<%= format("%04d", l) %>: {
15
- <%- r = expr.reachability -%>
16
- <%- %><%= gen.generate_code(expr, l, 12, false, oncut: onfail) -%>
17
- <%- if r == Packcr::CODE_REACH__ALWAYS_SUCCEED -%>
18
- <%- if c -%>
19
- // unreachable codes omitted
20
- <%- end -%>
21
- }
22
- <%- break -%>
23
- <%- else -%>
24
- <%- if r == Packcr::CODE_REACH__BOTH -%>
25
- break 'L<%= format("%04d", m) %>;
26
- <%- end -%>
27
- <%- end -%>
28
- }
29
- <%- end -%>
30
- }
8
+ <%- c = i + 1 < nodes.length -%>
9
+ <%- if expr.reversible?(gen) -%>
10
+ <%- %><%= gen.generate_code(expr, m, 4, false, reverse: true, oncut: onfail) -%>
11
+ <%- else -%>
12
+ <%- l = gen.next_label -%>
13
+ <%- r = expr.reachability -%>
14
+ <%- if r == Packcr::CODE_REACH__ALWAYS_SUCCEED -%>
15
+ catch(<%= l %>, || {
16
+ <%- %><%= gen.generate_code(expr, l, 8, false, oncut: onfail) -%>
17
+ <%- if c -%>
18
+ // unreachable codes omitted
19
+ <%- end -%>
20
+ NOP
21
+ })?
22
+ <%- break -%>
23
+ <%- else -%>
24
+ catch(<%= l %>, || {
25
+ <%- %><%= gen.generate_code(expr, l, 8, false, oncut: onfail) -%>
26
+ throw(<%= m %>)
27
+ })?;
28
+ <%- end -%>
29
+ <%- end -%>
31
30
  self.input.position_offset = p;
32
- <%- if gen.location -%>
31
+ <%- if gen.location -%>
33
32
  TODO
34
- <%- end -%>
33
+ <%- end -%>
35
34
  <%- if !c -%>
36
- break 'L<%= format("%04d", onfail) %>;
35
+ throw(<%= onfail %>)
37
36
  <%- end -%>
38
37
  <%- end -%>
39
- } // 'L<%= format("%04d", m) %>
38
+ })?;
@@ -1,9 +1,9 @@
1
1
  <%- a = charclass && charclass[0] == '^' -%>
2
2
  <%- i = a ? 1 : 0 -%>
3
3
  <%- any_code = !charclass || (a && n == 1) -%>
4
- let (<%= any_code ? "_" : "" %>u, n) = self.get_char_as_utf32();
4
+ let (<%= any_code ? "_" : "" %>u, n) = self.input.get_char_as_utf32();
5
5
  if n == 0 {
6
- break 'L<%= format("%04d", onfail) %>;
6
+ return throw(<%= onfail %>);
7
7
  }
8
8
  <%- unless any_code -%>
9
9
  if <% if !a -%>
@@ -35,7 +35,7 @@ if <% if !a -%>
35
35
  <%- end -%>
36
36
  <%- if !a -%>) <% end -%>
37
37
  <%- %>{
38
- break 'L<%= format("%04d", onfail) %>;
38
+ return throw(<%= onfail %>);
39
39
  }
40
40
  <%- end -%>
41
41
  self.input.position_offset += n;
@@ -4,18 +4,18 @@ let p = self.input.position_offset;
4
4
  <%- if gen.location -%>
5
5
  TODO
6
6
  <%- end -%>
7
- 'L<%= format("%04d", l) %>: {
8
- {
9
- <%- %><%= gen.generate_code(expr, l, 4, false) -%>
10
- }
7
+ catch(<%= l %>, || {
8
+ <%- %><%= gen.generate_code(expr, l, 4, false) -%>
11
9
  <%- if r != Packcr::CODE_REACH__ALWAYS_FAIL -%>
12
10
  self.input.position_offset = p;
13
11
  <%- if gen.location -%>
14
12
  TODO
15
13
  <%- end -%>
16
- break 'L<%= format("%04d", onfail) %>;
14
+ throw(<%= onfail %>)
15
+ <%- else -%>
16
+ NOP
17
17
  <%- end -%>
18
- }
18
+ })?;
19
19
  <%- if r != Packcr::CODE_REACH__ALWAYS_SUCCEED -%>
20
20
  self.input.position_offset = p;
21
21
  <%- if gen.location -%>
@@ -9,42 +9,69 @@ TODO
9
9
  let mut i = -1;
10
10
  <%- end -%>
11
11
  <%- m = gen.next_label -%>
12
- 'L<%= format("%04d", m) %>: loop {
13
- <%- if use_count -%>
14
- i += 1;
15
- <%- end -%>
16
- <%- if max >= 0 -%>
17
- if i >= <%= max %> { break; }
18
- <%- end -%>
19
- let p = self.input.position_offset;
20
- <%- if r != Packcr::CODE_REACH__ALWAYS_SUCCEED -%>
21
- <%- if gen.location -%>
22
- TODO
23
- <%- end -%>
24
- <%- end -%>
25
- <%- l = gen.next_label -%>
26
- <%- r = expr.reachability -%>
27
- 'L<%= format("%04d", l) %>: {
28
- <%- %><%= gen.generate_code(expr, l, 8, false) -%>
29
- if self.input.position_offset == p {
30
- break 'L<%= format("%04d", m) %>;
12
+ catch(<%= m %>, || {
13
+ loop {
14
+ <%- if use_count -%>
15
+ i += 1;
16
+ <%- end -%>
17
+ <%- if max >= 0 -%>
18
+ if i >= <%= max %> {
19
+ return NOP;
31
20
  }
21
+ <%- end -%>
22
+ let p = self.input.position_offset;
32
23
  <%- if r != Packcr::CODE_REACH__ALWAYS_SUCCEED -%>
33
- continue 'L<%= format("%04d", m) %>;
24
+ <%- if gen.location -%>
25
+ TODO
26
+ <%- end -%>
27
+ <%- end -%>
28
+ <%- l = gen.next_label -%>
29
+ <%- r = expr.reachability -%>
30
+ <%- if r == Packcr::CODE_REACH__ALWAYS_SUCCEED -%>
31
+ TODO
32
+ match (|| {
33
+ <%- %><%= gen.generate_code(expr, l, 12, false) -%>
34
+ if self.input.position_offset == p {
35
+ return throw(<%= m %>);
36
+ }
37
+ })() {
38
+ NOP => continue,
39
+ Err(label) if label != <%= l %> => return throw(label),
40
+ _ => {
41
+ self.input.position_offset = p;
42
+ <%- if gen.location -%>
43
+ TODO
44
+ <%- end -%>
45
+ return throw(<%= m %>);
46
+ }
47
+ }
48
+ <%- else -%>
49
+ match (|| {
50
+ <%- %><%= gen.generate_code(expr, l, 12, false) -%>
51
+ if self.input.position_offset == p {
52
+ return throw(<%= m %>);
53
+ }
54
+ NOP
55
+ })() {
56
+ NOP => continue,
57
+ Err(label) if label != <%= l %> => return throw(label),
58
+ _ => {
59
+ self.input.position_offset = p;
60
+ <%- if gen.location -%>
61
+ TODO
62
+ <%- end -%>
63
+ return throw(<%= m %>);
64
+ }
65
+ }
66
+ <%- end -%>
34
67
  }
35
- self.input.position_offset = p;
36
- <%- if gen.location -%>
37
- TODO
38
- <%- end -%>
39
- break 'L<%= format("%04d", m) %>;
40
- <%- end -%>
41
- }
68
+ })?;
42
69
  <%- if min > 0 -%>
43
70
  if i < <%= min %> {
44
71
  self.input.position_offset = p0;
45
72
  <%- if gen.location -%>
46
73
  TODO
47
74
  <%- end -%>
48
- break 'L<%= format("%04d", onfail) %>;
75
+ return throw(<%= onfail %>);
49
76
  }
50
77
  <%- end -%>
@@ -1,3 +1,3 @@
1
- if !self.apply_rule(Rule::<%= Packcr.camelize(name) %>, &mut answer, <%= index || 0 %>, offset, limits.clone()) {
2
- break 'L<%= format("%04d", onfail) %>;
1
+ if !self.apply_rule(Rule::<%= Packcr.camelize(name) %>, &mut answer, <%= index || 0 %>, offset, &limits) {
2
+ return throw(<%= onfail %>);
3
3
  }
@@ -1,12 +1,12 @@
1
1
  <%- for_ref = has_ref ? "" : "_" -%>
2
2
  #[allow(non_snake_case)]
3
- fn evaluate_rule_<%= name %>(
4
- &mut self,
5
- <%= for_ref %>offset: usize,
3
+ fn evaluate_rule_<%= name %>(<% -%>
4
+ <%- %>&mut self, <% -%>
5
+ <%- %><%= for_ref %>offset: usize, <% -%>
6
6
  <%- if gen.location -%>
7
7
  TODO
8
8
  <%- end -%>
9
- <%= for_ref %>limits: Option<RuleSet>,
9
+ <%- %><%= for_ref %>limits: RuleLimit<% -%>
10
10
  ) -> Option<ThunkChunk> {
11
11
  let mut answer = ThunkChunk::new(self.input.position_offset);
12
12
  <%- if gen.location -%>
@@ -19,16 +19,25 @@ fn evaluate_rule_<%= name %>(
19
19
  <%- end -%>
20
20
  <%- r = expr.reachability -%>
21
21
  <%- if r == Packcr::CODE_REACH__ALWAYS_SUCCEED -%>
22
- <%- -%><%= gen.generate_code(expr, 0, 4, false) -%>
22
+ let _ = (|| {
23
+ <%- -%><%= gen.generate_code(expr, 0, 8, false) -%>
24
+ NOP
25
+ })();
23
26
  self.level -= 1;
24
- return Some(answer);
27
+ Some(answer)
25
28
  <%- else -%>
26
- 'L0000: {
29
+ match (|| {
27
30
  <%- -%><%= gen.generate_code(expr, 0, 8, false) -%>
28
- self.level -= 1;
29
- return Some(answer);
31
+ NOP
32
+ })() {
33
+ NOP => {
34
+ self.level -= 1;
35
+ Some(answer)
36
+ }
37
+ _ => {
38
+ self.level -= 1;
39
+ None
40
+ }
30
41
  }
31
- self.level -= 1;
32
- return None;
33
42
  <%- end -%>
34
43
  }
@@ -1,8 +1,8 @@
1
- if self.refill_buffer(<%= n %>) < <%= n %>
2
- || self.input.buffer.as_bytes()[self.input.position_offset..(self.input.position_offset + <%= n %>)] != <% -%>
3
- <%- %>[<%= value[0, n].each_char.map { |c| "b'#{Packcr.escape_character(c)}'" }.join(", ") %>]
1
+ if self.input.refill_buffer(<%= n %>) < <%= n %>
2
+ || !self.input.buffer[self.input.position_offset..] <% -%>
3
+ <%- %>.starts_with("<%= value[0, n].each_char.map { |c| "#{Packcr.escape_character(c)}" }.join %>")
4
4
  {
5
- break 'L<%= format("%04d", onfail) %>;
5
+ return throw(<%= onfail %>);
6
6
  }
7
7
  <%- if gen.location -%>
8
8
  TODO
@@ -0,0 +1,7 @@
1
+ if self.input.refill_buffer(<%= n %>) >= <%= n %>
2
+ && self.input.buffer[self.input.position_offset..]<% -%>
3
+ <%- %>.starts_with("<%= value[0, n].each_char.map { |c| "#{Packcr.escape_character(c)}" }.join %>")
4
+ {
5
+ self.input.position_offset += <%= n %>;
6
+ return throw(<%= onsuccess %>);
7
+ }
@@ -1,7 +1,7 @@
1
- if self.refill_buffer(1) < 1
2
- || self.input.buffer.as_bytes()[self.input.position_offset] != b'<%= Packcr.escape_character(value[0]) %>'
1
+ if self.input.refill_buffer(1) < 1
2
+ || !self.input.buffer[self.input.position_offset..].starts_with("<%= Packcr.escape_character(value[0]) %>")
3
3
  {
4
- break 'L<%= format("%04d", onfail) %>;
4
+ return throw(<%= onfail %>);
5
5
  }
6
6
  <%- if gen.location -%>
7
7
  TODO
@@ -0,0 +1,6 @@
1
+ if self.input.refill_buffer(1) >= 1
2
+ && self.input.buffer[self.input.position_offset..].starts_with("<%= Packcr.escape_character(value[0]) %>")
3
+ {
4
+ self.input.position_offset += 1;
5
+ return throw(<%= onsuccess %>);
6
+ }
@@ -1,3 +1,3 @@
1
1
  class Packcr
2
- VERSION = "0.1.0".freeze
2
+ VERSION = "0.1.1".freeze
3
3
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: packcr
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - wanabe
8
8
  bindir: exe
9
9
  cert_chain: []
10
- date: 2025-05-26 00:00:00.000000000 Z
10
+ date: 2025-06-03 00:00:00.000000000 Z
11
11
  dependencies: []
12
12
  executables:
13
13
  - packcr
@@ -108,9 +108,11 @@ files:
108
108
  - lib/packcr/templates/node/string_many.c.erb
109
109
  - lib/packcr/templates/node/string_many.rb.erb
110
110
  - lib/packcr/templates/node/string_many.rs.erb
111
+ - lib/packcr/templates/node/string_many_reverse.rs.erb
111
112
  - lib/packcr/templates/node/string_one.c.erb
112
113
  - lib/packcr/templates/node/string_one.rb.erb
113
114
  - lib/packcr/templates/node/string_one.rs.erb
115
+ - lib/packcr/templates/node/string_one_reverse.rs.erb
114
116
  - lib/packcr/util.rb
115
117
  - lib/packcr/version.rb
116
118
  homepage: https://github.com/wanabe/packcr
@@ -125,7 +127,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
125
127
  requirements:
126
128
  - - ">="
127
129
  - !ruby/object:Gem::Version
128
- version: 2.7.0
130
+ version: 3.2.0
129
131
  required_rubygems_version: !ruby/object:Gem::Requirement
130
132
  requirements:
131
133
  - - ">="
@@ -134,5 +136,5 @@ required_rubygems_version: !ruby/object:Gem::Requirement
134
136
  requirements: []
135
137
  rubygems_version: 3.6.5
136
138
  specification_version: 4
137
- summary: Parser generator for C or Ruby
139
+ summary: Parser generator for C, Ruby, and Rust
138
140
  test_files: []