packcr 0.0.8 → 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 (52) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/lib/packcr/context.rb +14 -5
  4. data/lib/packcr/generated/context.rb +184 -85
  5. data/lib/packcr/generated/node/action_node.rb +16 -1
  6. data/lib/packcr/generated/node/alternate_node.rb +47 -7
  7. data/lib/packcr/generated/node/capture_node.rb +16 -1
  8. data/lib/packcr/generated/node/charclass_node.rb +73 -6
  9. data/lib/packcr/generated/node/eof_node.rb +8 -1
  10. data/lib/packcr/generated/node/error_node.rb +8 -1
  11. data/lib/packcr/generated/node/expand_node.rb +8 -1
  12. data/lib/packcr/generated/node/predicate_node.rb +37 -2
  13. data/lib/packcr/generated/node/quantity_node.rb +56 -2
  14. data/lib/packcr/generated/node/reference_node.rb +11 -2
  15. data/lib/packcr/generated/node/rule_node.rb +32 -1
  16. data/lib/packcr/generated/node/sequence_node.rb +19 -1
  17. data/lib/packcr/generated/node/string_node.rb +50 -2
  18. data/lib/packcr/generator.rb +4 -3
  19. data/lib/packcr/node/action_node.rb +2 -2
  20. data/lib/packcr/node/alternate_node.rb +2 -2
  21. data/lib/packcr/node/capture_node.rb +2 -2
  22. data/lib/packcr/node/charclass_node.rb +15 -15
  23. data/lib/packcr/node/eof_node.rb +2 -2
  24. data/lib/packcr/node/error_node.rb +2 -2
  25. data/lib/packcr/node/expand_node.rb +2 -2
  26. data/lib/packcr/node/predicate_node.rb +3 -3
  27. data/lib/packcr/node/quantity_node.rb +4 -4
  28. data/lib/packcr/node/reference_node.rb +5 -4
  29. data/lib/packcr/node/rule_node.rb +4 -3
  30. data/lib/packcr/node/sequence_node.rb +2 -2
  31. data/lib/packcr/node/string_node.rb +17 -3
  32. data/lib/packcr/parser.rb +403 -254
  33. data/lib/packcr/stream.rb +1 -1
  34. data/lib/packcr/templates/context/source.c.erb +30 -26
  35. data/lib/packcr/templates/context/source.rb.erb +160 -159
  36. data/lib/packcr/templates/context/source.rs.erb +627 -0
  37. data/lib/packcr/templates/node/action.rs.erb +6 -0
  38. data/lib/packcr/templates/node/alternate.rs.erb +38 -0
  39. data/lib/packcr/templates/node/capture.rs.erb +13 -0
  40. data/lib/packcr/templates/node/charclass_utf8.rs.erb +41 -0
  41. data/lib/packcr/templates/node/predicate_neg.rs.erb +24 -0
  42. data/lib/packcr/templates/node/quantity_many.rs.erb +77 -0
  43. data/lib/packcr/templates/node/reference.rs.erb +3 -0
  44. data/lib/packcr/templates/node/rule.rs.erb +43 -0
  45. data/lib/packcr/templates/node/sequence.rs.erb +12 -0
  46. data/lib/packcr/templates/node/string_many.rs.erb +10 -0
  47. data/lib/packcr/templates/node/string_many_reverse.rs.erb +7 -0
  48. data/lib/packcr/templates/node/string_one.rs.erb +9 -0
  49. data/lib/packcr/templates/node/string_one_reverse.rs.erb +6 -0
  50. data/lib/packcr/util.rb +9 -0
  51. data/lib/packcr/version.rb +1 -1
  52. metadata +20 -67
@@ -0,0 +1,41 @@
1
+ <%- a = charclass && charclass[0] == '^' -%>
2
+ <%- i = a ? 1 : 0 -%>
3
+ <%- any_code = !charclass || (a && n == 1) -%>
4
+ let (<%= any_code ? "_" : "" %>u, n) = self.input.get_char_as_utf32();
5
+ if n == 0 {
6
+ return throw(<%= onfail %>);
7
+ }
8
+ <%- unless any_code -%>
9
+ if <% if !a -%>
10
+ <%- %>!(<% end -%>
11
+ <%- while i < n -%>
12
+ <%- if charclass[i] == '\\' && i + 1 < n -%>
13
+ <%- i += 1 -%>
14
+ <%- end -%>
15
+ <%- u = charclass[i].ord -%>
16
+ <%- i += 1 -%>
17
+ <%- if r -%>
18
+ <%- # character range -%>
19
+ <%- %>(0x<%= format("%06x", u0) %>..=0x<%= format("%06x", u) %>).contains(&u)<% -%>
20
+ <%- if i < n %> || <% end -%>
21
+ <%- u0 = 0 -%>
22
+ <%- r = false -%>
23
+ <%- elsif charclass[i] != "-" || i == n - 1 # the individual '-' character is valid when it is at the first or the last position -%>
24
+ <%- # single character -%>
25
+ <%- %>u == 0x<%= format("%06x", u) %><% if i < n %> || <% end -%>
26
+ <%- u0 = 0 -%>
27
+ <%- r = false -%>
28
+ <%- elsif charclass[i] == "-" -%>
29
+ <%- i += 1 -%>
30
+ <%- u0 = u -%>
31
+ <%- r = true -%>
32
+ <%- else -%>
33
+ <%- raise "unexpected charclass #{charclass[i]}" -%>
34
+ <%- end -%>
35
+ <%- end -%>
36
+ <%- if !a -%>) <% end -%>
37
+ <%- %>{
38
+ return throw(<%= onfail %>);
39
+ }
40
+ <%- end -%>
41
+ self.input.position_offset += n;
@@ -0,0 +1,24 @@
1
+ <%- l = gen.next_label -%>
2
+ <%- r = expr.reachability -%>
3
+ let p = self.input.position_offset;
4
+ <%- if gen.location -%>
5
+ TODO
6
+ <%- end -%>
7
+ catch(<%= l %>, || {
8
+ <%- %><%= gen.generate_code(expr, l, 4, false) -%>
9
+ <%- if r != Packcr::CODE_REACH__ALWAYS_FAIL -%>
10
+ self.input.position_offset = p;
11
+ <%- if gen.location -%>
12
+ TODO
13
+ <%- end -%>
14
+ throw(<%= onfail %>)
15
+ <%- else -%>
16
+ NOP
17
+ <%- end -%>
18
+ })?;
19
+ <%- if r != Packcr::CODE_REACH__ALWAYS_SUCCEED -%>
20
+ self.input.position_offset = p;
21
+ <%- if gen.location -%>
22
+ TODO
23
+ <%- end -%>
24
+ <%- end -%>
@@ -0,0 +1,77 @@
1
+ <%- if min > 0 -%>
2
+ let p0 = self.input.position_offset;
3
+ <%- if gen.location -%>
4
+ TODO
5
+ <%- end -%>
6
+ <%- end -%>
7
+ <%- use_count = max >= 0 || min > 0 -%>
8
+ <%- if use_count -%>
9
+ let mut i = -1;
10
+ <%- end -%>
11
+ <%- m = gen.next_label -%>
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;
20
+ }
21
+ <%- end -%>
22
+ let p = self.input.position_offset;
23
+ <%- if r != Packcr::CODE_REACH__ALWAYS_SUCCEED -%>
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 -%>
67
+ }
68
+ })?;
69
+ <%- if min > 0 -%>
70
+ if i < <%= min %> {
71
+ self.input.position_offset = p0;
72
+ <%- if gen.location -%>
73
+ TODO
74
+ <%- end -%>
75
+ return throw(<%= onfail %>);
76
+ }
77
+ <%- end -%>
@@ -0,0 +1,3 @@
1
+ if !self.apply_rule(Rule::<%= Packcr.camelize(name) %>, &mut answer, <%= index || 0 %>, offset, &limits) {
2
+ return throw(<%= onfail %>);
3
+ }
@@ -0,0 +1,43 @@
1
+ <%- for_ref = has_ref ? "" : "_" -%>
2
+ #[allow(non_snake_case)]
3
+ fn evaluate_rule_<%= name %>(<% -%>
4
+ <%- %>&mut self, <% -%>
5
+ <%- %><%= for_ref %>offset: usize, <% -%>
6
+ <%- if gen.location -%>
7
+ TODO
8
+ <%- end -%>
9
+ <%- %><%= for_ref %>limits: RuleLimit<% -%>
10
+ ) -> Option<ThunkChunk> {
11
+ let mut answer = ThunkChunk::new(self.input.position_offset);
12
+ <%- if gen.location -%>
13
+ TODO
14
+ <%- end -%>
15
+ self.level += 1;
16
+ answer.capts.resize(<%= capts.length %>);
17
+ <%- if vars.length > 0 -%>
18
+ answer.values.clear();
19
+ <%- end -%>
20
+ <%- r = expr.reachability -%>
21
+ <%- if r == Packcr::CODE_REACH__ALWAYS_SUCCEED -%>
22
+ let _ = (|| {
23
+ <%- -%><%= gen.generate_code(expr, 0, 8, false) -%>
24
+ NOP
25
+ })();
26
+ self.level -= 1;
27
+ Some(answer)
28
+ <%- else -%>
29
+ match (|| {
30
+ <%- -%><%= gen.generate_code(expr, 0, 8, false) -%>
31
+ NOP
32
+ })() {
33
+ NOP => {
34
+ self.level -= 1;
35
+ Some(answer)
36
+ }
37
+ _ => {
38
+ self.level -= 1;
39
+ None
40
+ }
41
+ }
42
+ <%- end -%>
43
+ }
@@ -0,0 +1,12 @@
1
+ <%- if @cut && oncut -%>
2
+ <%- onfail, oncut = oncut, nil -%>
3
+ <%- end -%>
4
+ <%- nodes.each_with_index do |expr, i| -%>
5
+ <%- -%><%= gen.generate_code(expr, onfail, 0, false, oncut: oncut) -%>
6
+ <%- if expr.reachability == Packcr::CODE_REACH__ALWAYS_FAIL -%>
7
+ <%- if i < nodes.length - 1 -%>
8
+ /* unreachable codes omitted */
9
+ <%- end -%>
10
+ <%- break -%>
11
+ <%- end -%>
12
+ <%- end -%>
@@ -0,0 +1,10 @@
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
+ return throw(<%= onfail %>);
6
+ }
7
+ <%- if gen.location -%>
8
+ TODO
9
+ <%- end -%>
10
+ self.input.position_offset += <%= n %>;
@@ -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
+ }
@@ -0,0 +1,9 @@
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
+ return throw(<%= onfail %>);
5
+ }
6
+ <%- if gen.location -%>
7
+ TODO
8
+ <%- end -%>
9
+ self.input.position_offset += 1;
@@ -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
+ }
data/lib/packcr/util.rb CHANGED
@@ -88,6 +88,15 @@ class Packcr
88
88
  result.gsub!(/^( *?) {0,4}<<<</) { ::Regexp.last_match(1) }
89
89
  result
90
90
  end
91
+
92
+ def escape_varriables(code, lang)
93
+ code = code.gsub("$$", "*out") if lang == :rs
94
+ code.gsub("$", lang == :rb ? "__" : "_")
95
+ end
96
+
97
+ def camelize(string)
98
+ string.sub(/^_/, "Underscore").split(/[^a-zA-Z0-9]+/).map(&:capitalize).join
99
+ end
91
100
  end
92
101
 
93
102
  extend Util
@@ -1,3 +1,3 @@
1
1
  class Packcr
2
- VERSION = "0.0.8".freeze
2
+ VERSION = "0.1.1".freeze
3
3
  end
metadata CHANGED
@@ -1,73 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: packcr
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.8
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - wanabe
8
- autorequire:
9
8
  bindir: exe
10
9
  cert_chain: []
11
- date: 2023-02-18 00:00:00.000000000 Z
12
- dependencies:
13
- - !ruby/object:Gem::Dependency
14
- name: rake
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - "~>"
18
- - !ruby/object:Gem::Version
19
- version: '13.0'
20
- type: :development
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - "~>"
25
- - !ruby/object:Gem::Version
26
- version: '13.0'
27
- - !ruby/object:Gem::Dependency
28
- name: rspec
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - "~>"
32
- - !ruby/object:Gem::Version
33
- version: '3.12'
34
- type: :development
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - "~>"
39
- - !ruby/object:Gem::Version
40
- version: '3.12'
41
- - !ruby/object:Gem::Dependency
42
- name: rspec-parameterized
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - "~>"
46
- - !ruby/object:Gem::Version
47
- version: '1.0'
48
- type: :development
49
- prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - "~>"
53
- - !ruby/object:Gem::Version
54
- version: '1.0'
55
- - !ruby/object:Gem::Dependency
56
- name: rubocop
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - "~>"
60
- - !ruby/object:Gem::Version
61
- version: 1.43.0
62
- type: :development
63
- prerelease: false
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
66
- - - "~>"
67
- - !ruby/object:Gem::Version
68
- version: 1.43.0
69
- description:
70
- email:
10
+ date: 2025-06-03 00:00:00.000000000 Z
11
+ dependencies: []
71
12
  executables:
72
13
  - packcr
73
14
  extensions: []
@@ -116,12 +57,16 @@ files:
116
57
  - lib/packcr/templates/context/header.c.erb
117
58
  - lib/packcr/templates/context/source.c.erb
118
59
  - lib/packcr/templates/context/source.rb.erb
60
+ - lib/packcr/templates/context/source.rs.erb
119
61
  - lib/packcr/templates/node/action.c.erb
120
62
  - lib/packcr/templates/node/action.rb.erb
63
+ - lib/packcr/templates/node/action.rs.erb
121
64
  - lib/packcr/templates/node/alternate.c.erb
122
65
  - lib/packcr/templates/node/alternate.rb.erb
66
+ - lib/packcr/templates/node/alternate.rs.erb
123
67
  - lib/packcr/templates/node/capture.c.erb
124
68
  - lib/packcr/templates/node/capture.rb.erb
69
+ - lib/packcr/templates/node/capture.rs.erb
125
70
  - lib/packcr/templates/node/charclass.c.erb
126
71
  - lib/packcr/templates/node/charclass.rb.erb
127
72
  - lib/packcr/templates/node/charclass_any.c.erb
@@ -132,6 +77,7 @@ files:
132
77
  - lib/packcr/templates/node/charclass_one.rb.erb
133
78
  - lib/packcr/templates/node/charclass_utf8.c.erb
134
79
  - lib/packcr/templates/node/charclass_utf8.rb.erb
80
+ - lib/packcr/templates/node/charclass_utf8.rs.erb
135
81
  - lib/packcr/templates/node/charclass_utf8_reverse.rb.erb
136
82
  - lib/packcr/templates/node/eof.c.erb
137
83
  - lib/packcr/templates/node/eof.rb.erb
@@ -143,21 +89,30 @@ files:
143
89
  - lib/packcr/templates/node/predicate.rb.erb
144
90
  - lib/packcr/templates/node/predicate_neg.c.erb
145
91
  - lib/packcr/templates/node/predicate_neg.rb.erb
92
+ - lib/packcr/templates/node/predicate_neg.rs.erb
146
93
  - lib/packcr/templates/node/quantity_many.c.erb
147
94
  - lib/packcr/templates/node/quantity_many.rb.erb
95
+ - lib/packcr/templates/node/quantity_many.rs.erb
148
96
  - lib/packcr/templates/node/quantity_one.c.erb
149
97
  - lib/packcr/templates/node/quantity_one.rb.erb
150
98
  - lib/packcr/templates/node/reference.c.erb
151
99
  - lib/packcr/templates/node/reference.rb.erb
100
+ - lib/packcr/templates/node/reference.rs.erb
152
101
  - lib/packcr/templates/node/reference_reverse.rb.erb
153
102
  - lib/packcr/templates/node/rule.c.erb
154
103
  - lib/packcr/templates/node/rule.rb.erb
104
+ - lib/packcr/templates/node/rule.rs.erb
155
105
  - lib/packcr/templates/node/sequence.c.erb
156
106
  - lib/packcr/templates/node/sequence.rb.erb
107
+ - lib/packcr/templates/node/sequence.rs.erb
157
108
  - lib/packcr/templates/node/string_many.c.erb
158
109
  - lib/packcr/templates/node/string_many.rb.erb
110
+ - lib/packcr/templates/node/string_many.rs.erb
111
+ - lib/packcr/templates/node/string_many_reverse.rs.erb
159
112
  - lib/packcr/templates/node/string_one.c.erb
160
113
  - lib/packcr/templates/node/string_one.rb.erb
114
+ - lib/packcr/templates/node/string_one.rs.erb
115
+ - lib/packcr/templates/node/string_one_reverse.rs.erb
161
116
  - lib/packcr/util.rb
162
117
  - lib/packcr/version.rb
163
118
  homepage: https://github.com/wanabe/packcr
@@ -165,7 +120,6 @@ licenses:
165
120
  - MIT
166
121
  metadata:
167
122
  rubygems_mfa_required: 'true'
168
- post_install_message:
169
123
  rdoc_options: []
170
124
  require_paths:
171
125
  - lib
@@ -173,15 +127,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
173
127
  requirements:
174
128
  - - ">="
175
129
  - !ruby/object:Gem::Version
176
- version: 2.7.0
130
+ version: 3.2.0
177
131
  required_rubygems_version: !ruby/object:Gem::Requirement
178
132
  requirements:
179
133
  - - ">="
180
134
  - !ruby/object:Gem::Version
181
135
  version: '0'
182
136
  requirements: []
183
- rubygems_version: 3.4.6
184
- signing_key:
137
+ rubygems_version: 3.6.5
185
138
  specification_version: 4
186
- summary: Parser generator for C or Ruby
139
+ summary: Parser generator for C, Ruby, and Rust
187
140
  test_files: []