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
@@ -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.get_char_as_utf32();
5
+ if n == 0 {
6
+ break 'L<%= format("%04d", 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
+ break 'L<%= format("%04d", 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
+ 'L<%= format("%04d", l) %>: {
8
+ {
9
+ <%- %><%= gen.generate_code(expr, l, 4, false) -%>
10
+ }
11
+ <%- if r != Packcr::CODE_REACH__ALWAYS_FAIL -%>
12
+ self.input.position_offset = p;
13
+ <%- if gen.location -%>
14
+ TODO
15
+ <%- end -%>
16
+ break 'L<%= format("%04d", onfail) %>;
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,50 @@
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
+ '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) %>;
31
+ }
32
+ <%- if r != Packcr::CODE_REACH__ALWAYS_SUCCEED -%>
33
+ continue 'L<%= format("%04d", m) %>;
34
+ }
35
+ self.input.position_offset = p;
36
+ <%- if gen.location -%>
37
+ TODO
38
+ <%- end -%>
39
+ break 'L<%= format("%04d", m) %>;
40
+ <%- end -%>
41
+ }
42
+ <%- if min > 0 -%>
43
+ if i < <%= min %> {
44
+ self.input.position_offset = p0;
45
+ <%- if gen.location -%>
46
+ TODO
47
+ <%- end -%>
48
+ break 'L<%= format("%04d", onfail) %>;
49
+ }
50
+ <%- end -%>
@@ -0,0 +1,3 @@
1
+ if !self.apply_rule(Rule::<%= Packcr.camelize(name) %>, &mut answer, <%= index || 0 %>, offset, limits.clone()) {
2
+ break 'L<%= format("%04d", onfail) %>;
3
+ }
@@ -0,0 +1,34 @@
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: Option<RuleSet>,
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
+ <%- -%><%= gen.generate_code(expr, 0, 4, false) -%>
23
+ self.level -= 1;
24
+ return Some(answer);
25
+ <%- else -%>
26
+ 'L0000: {
27
+ <%- -%><%= gen.generate_code(expr, 0, 8, false) -%>
28
+ self.level -= 1;
29
+ return Some(answer);
30
+ }
31
+ self.level -= 1;
32
+ return None;
33
+ <%- end -%>
34
+ }
@@ -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.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(", ") %>]
4
+ {
5
+ break 'L<%= format("%04d", onfail) %>;
6
+ }
7
+ <%- if gen.location -%>
8
+ TODO
9
+ <%- end -%>
10
+ self.input.position_offset += <%= n %>;
@@ -0,0 +1,9 @@
1
+ if self.refill_buffer(1) < 1
2
+ || self.input.buffer.as_bytes()[self.input.position_offset] != b'<%= Packcr.escape_character(value[0]) %>'
3
+ {
4
+ break 'L<%= format("%04d", onfail) %>;
5
+ }
6
+ <%- if gen.location -%>
7
+ TODO
8
+ <%- end -%>
9
+ self.input.position_offset += 1;
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.0".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.0
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-05-26 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,28 @@ 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
159
111
  - lib/packcr/templates/node/string_one.c.erb
160
112
  - lib/packcr/templates/node/string_one.rb.erb
113
+ - lib/packcr/templates/node/string_one.rs.erb
161
114
  - lib/packcr/util.rb
162
115
  - lib/packcr/version.rb
163
116
  homepage: https://github.com/wanabe/packcr
@@ -165,7 +118,6 @@ licenses:
165
118
  - MIT
166
119
  metadata:
167
120
  rubygems_mfa_required: 'true'
168
- post_install_message:
169
121
  rdoc_options: []
170
122
  require_paths:
171
123
  - lib
@@ -180,8 +132,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
180
132
  - !ruby/object:Gem::Version
181
133
  version: '0'
182
134
  requirements: []
183
- rubygems_version: 3.4.6
184
- signing_key:
135
+ rubygems_version: 3.6.5
185
136
  specification_version: 4
186
137
  summary: Parser generator for C or Ruby
187
138
  test_files: []