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
@@ -17,16 +17,16 @@ class Packcr
17
17
  gen.lang == :rb && !gen.ascii
18
18
  end
19
19
 
20
- def generate_code(gen, onfail, indent, bare, oncut: nil)
21
- return generate_ascii_code(gen, onfail, indent, bare) if gen.ascii
20
+ def generate_code(gen, onfail, indent, unwrap, oncut: nil)
21
+ return generate_ascii_code(gen, onfail, indent, unwrap) if gen.ascii
22
22
 
23
- generate_utf8_charclass_code(gen, onfail, indent, bare)
23
+ generate_utf8_charclass_code(gen, onfail, indent, unwrap)
24
24
  end
25
25
 
26
- def generate_reverse_code(gen, onsuccess, indent, bare, oncut: nil)
26
+ def generate_reverse_code(gen, onsuccess, indent, unwrap, oncut: nil)
27
27
  raise "unexpected" if gen.ascii
28
28
 
29
- generate_utf8_charclass_reverse_code(gen, onsuccess, indent, bare)
29
+ generate_utf8_charclass_reverse_code(gen, onsuccess, indent, unwrap)
30
30
  end
31
31
 
32
32
  def reachability
@@ -39,20 +39,20 @@ class Packcr
39
39
 
40
40
  private
41
41
 
42
- def generate_utf8_charclass_code(gen, onfail, indent, bare)
42
+ def generate_utf8_charclass_code(gen, onfail, indent, unwrap)
43
43
  charclass = value
44
44
  if charclass && charclass.encoding != Encoding::UTF_8
45
45
  charclass = charclass.dup.force_encoding(Encoding::UTF_8)
46
46
  end
47
47
  n = charclass&.length || 0
48
48
  if charclass.nil? || n > 0
49
- gen.write Packcr.format_code(get_utf8_code(gen, onfail, indent, bare, charclass, n), indent: indent, unwrap: bare)
49
+ get_utf8_code(gen, onfail, indent, unwrap, charclass, n)
50
50
  else
51
- gen.write Packcr.format_code(get_fail_code(gen, onfail, indent, bare), indent: indent)
51
+ get_fail_code(gen, onfail, indent, unwrap)
52
52
  end
53
53
  end
54
54
 
55
- def generate_utf8_charclass_reverse_code(gen, onsuccess, indent, bare)
55
+ def generate_utf8_charclass_reverse_code(gen, onsuccess, indent, unwrap)
56
56
  charclass = value
57
57
  if charclass && charclass.encoding != Encoding::UTF_8
58
58
  charclass = charclass.dup.force_encoding(Encoding::UTF_8)
@@ -60,10 +60,10 @@ class Packcr
60
60
  n = charclass&.length || 0
61
61
  return unless charclass.nil? || n > 0
62
62
 
63
- gen.write Packcr.format_code(get_utf8_reverse_code(gen, onsuccess, indent, bare, charclass, n), indent: indent, unwrap: bare)
63
+ get_utf8_reverse_code(gen, onsuccess, indent, unwrap, charclass, n)
64
64
  end
65
65
 
66
- def generate_ascii_code(gen, onfail, indent, bare)
66
+ def generate_ascii_code(gen, onfail, indent, unwrap)
67
67
  charclass = value
68
68
  if charclass
69
69
  n = charclass.length
@@ -74,15 +74,15 @@ class Packcr
74
74
  end
75
75
  if n > 0
76
76
  if n > 1
77
- gen.write Packcr.format_code(get_code(gen, onfail, indent, bare, charclass, n, a), indent: indent, unwrap: bare)
77
+ get_code(gen, onfail, indent, unwrap, charclass, n, a)
78
78
  else
79
- gen.write Packcr.format_code(get_one_code(gen, onfail, indent, bare, charclass, n, a), indent: indent)
79
+ get_one_code(gen, onfail, indent, unwrap, charclass, n, a)
80
80
  end
81
81
  else
82
- gen.write Packcr.format_code(get_fail_code(gen, onfail, indent, bare), indent: indent)
82
+ get_fail_code(gen, onfail, indent, unwrap)
83
83
  end
84
84
  else
85
- gen.write Packcr.format_code(get_any_code(gen, onfail, indent, bare, charclass), indent: indent)
85
+ get_any_code(gen, onfail, indent, unwrap, charclass)
86
86
  end
87
87
  end
88
88
 
@@ -5,8 +5,8 @@ class Packcr
5
5
  $stdout.print "#{" " * indent}Eof()\n"
6
6
  end
7
7
 
8
- def generate_code(gen, onfail, indent, bare, oncut: nil)
9
- gen.write Packcr.format_code(get_code(gen, onfail, indent, bare, oncut), indent: indent, unwrap: bare)
8
+ def generate_code(gen, onfail, indent, unwrap, oncut: nil)
9
+ get_code(gen, onfail, indent, unwrap, oncut)
10
10
  end
11
11
 
12
12
  def reachability
@@ -29,8 +29,8 @@ class Packcr
29
29
  $stdout.print "#{" " * indent}}\n"
30
30
  end
31
31
 
32
- def generate_code(gen, onfail, indent, bare, oncut: nil)
33
- gen.write Packcr.format_code(get_code(gen, onfail, indent, bare, oncut), indent: indent, unwrap: bare)
32
+ def generate_code(gen, onfail, indent, unwrap, oncut: nil)
33
+ get_code(gen, onfail, indent, unwrap, oncut)
34
34
  end
35
35
 
36
36
  def reachability
@@ -15,8 +15,8 @@ class Packcr
15
15
  $stdout.print ")\n"
16
16
  end
17
17
 
18
- def generate_code(gen, onfail, indent, bare, oncut: nil)
19
- gen.write Packcr.format_code(get_code(gen, onfail, indent, bare, oncut), indent: indent, unwrap: bare)
18
+ def generate_code(gen, onfail, indent, unwrap, oncut: nil)
19
+ get_code(gen, onfail, indent, unwrap, oncut)
20
20
  end
21
21
 
22
22
  def reachability
@@ -15,11 +15,11 @@ class Packcr
15
15
  $stdout.print "#{" " * indent}}\n"
16
16
  end
17
17
 
18
- def generate_code(gen, onfail, indent, bare, oncut: nil)
18
+ def generate_code(gen, onfail, indent, unwrap, oncut: nil)
19
19
  if neg
20
- gen.write Packcr.format_code(get_neg_code(gen, onfail, indent, bare, oncut), indent: indent, unwrap: bare)
20
+ get_neg_code(gen, onfail, indent, unwrap, oncut)
21
21
  else
22
- gen.write Packcr.format_code(get_code(gen, onfail, indent, bare, oncut), indent: indent, unwrap: bare)
22
+ get_code(gen, onfail, indent, unwrap, oncut)
23
23
  end
24
24
  end
25
25
 
@@ -16,14 +16,14 @@ class Packcr
16
16
  $stdout.print "#{" " * indent}}\n"
17
17
  end
18
18
 
19
- def generate_code(gen, onfail, indent, bare, oncut: nil)
19
+ def generate_code(gen, onfail, indent, unwrap, oncut: nil)
20
20
  if max > 1 || max < 0
21
- gen.write Packcr.format_code(get_many_code(gen, onfail, indent, bare, oncut), indent: indent, unwrap: bare)
21
+ get_many_code(gen, onfail, indent, unwrap, oncut)
22
22
  elsif max == 1
23
23
  if min > 0
24
- gen.write gen.generate_code(expr, onfail, indent, bare, oncut: oncut)
24
+ gen.generate_code(expr, onfail, indent, unwrap, oncut: oncut)
25
25
  else
26
- gen.write Packcr.format_code(get_one_code(gen, onfail, indent, bare, oncut), indent: indent, unwrap: bare)
26
+ get_one_code(gen, onfail, indent, unwrap, oncut)
27
27
  end
28
28
  end
29
29
  end
@@ -20,12 +20,12 @@ class Packcr
20
20
  gen.lang == :rb
21
21
  end
22
22
 
23
- def generate_code(gen, onfail, indent, bare, oncut: nil)
24
- gen.write Packcr.format_code(get_code(gen, onfail, indent, bare, oncut), indent: indent, unwrap: bare)
23
+ def generate_code(gen, onfail, indent, unwrap, oncut: nil)
24
+ get_code(gen, onfail, indent, unwrap, oncut)
25
25
  end
26
26
 
27
- def generate_reverse_code(gen, onsuccess, indent, bare, oncut: nil)
28
- gen.write Packcr.format_code(get_reverse_code(gen, onsuccess, indent, bare, oncut), indent: indent)
27
+ def generate_reverse_code(gen, onsuccess, indent, unwrap, oncut: nil)
28
+ get_reverse_code(gen, onsuccess, indent, unwrap, oncut)
29
29
  end
30
30
 
31
31
  def reachability
@@ -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)
@@ -21,8 +22,8 @@ class Packcr
21
22
  $stdout.print "#{" " * indent}}\n"
22
23
  end
23
24
 
24
- def generate_code(gen, onfail, indent, bare, oncut: nil)
25
- gen.write Packcr.format_code(get_code(gen, onfail, indent, bare, oncut), indent: indent, unwrap: bare)
25
+ def generate_code(gen, onfail, indent, unwrap, oncut: nil)
26
+ get_code(gen, onfail, indent, unwrap, oncut)
26
27
  end
27
28
 
28
29
  def reachability
@@ -53,8 +53,8 @@ class Packcr
53
53
  m
54
54
  end
55
55
 
56
- def generate_code(gen, onfail, indent, bare, oncut: nil)
57
- gen.write Packcr.format_code(get_code(gen, onfail, indent, bare, oncut), indent: indent)
56
+ def generate_code(gen, onfail, indent, unwrap, oncut: nil)
57
+ get_code(gen, onfail, indent, unwrap, oncut)
58
58
  end
59
59
 
60
60
  def reachability
@@ -17,14 +17,28 @@ class Packcr
17
17
  $stdout.print "')\n"
18
18
  end
19
19
 
20
- def generate_code(gen, onfail, indent, bare, oncut: nil)
20
+ def reversible?(gen)
21
+ gen.lang == :rs
22
+ end
23
+
24
+ def generate_code(gen, onfail, indent, unwrap, oncut: nil)
21
25
  n = value&.length || 0
22
26
  return unless n > 0
23
27
 
24
28
  if n > 1
25
- gen.write Packcr.format_code(get_many_code(gen, onfail, indent, bare, oncut, n), indent: indent)
29
+ get_many_code(gen, onfail, indent, unwrap, oncut, n)
30
+ else
31
+ get_one_code(gen, onfail, indent, unwrap, oncut, n)
32
+ end
33
+ end
34
+
35
+ def generate_reverse_code(gen, onsuccess, indent, unwrap, oncut: nil)
36
+ n = value&.length || 0
37
+
38
+ if n > 1
39
+ get_many_reverse_code(gen, onsuccess, indent, unwrap, oncut, n)
26
40
  else
27
- gen.write Packcr.format_code(get_one_code(gen, onfail, indent, bare, oncut, n), indent: indent)
41
+ get_one_reverse_code(gen, onsuccess, indent, unwrap, oncut, n)
28
42
  end
29
43
  end
30
44