packcr 0.0.6 → 0.0.7

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 (81) hide show
  1. checksums.yaml +4 -4
  2. data/lib/packcr/cli.rb +18 -16
  3. data/lib/packcr/code_block.rb +0 -1
  4. data/lib/packcr/context.rb +19 -17
  5. data/lib/packcr/generated/context.rb +440 -0
  6. data/lib/packcr/generated/node/action_node.rb +60 -0
  7. data/lib/packcr/generated/node/alternate_node.rb +98 -0
  8. data/lib/packcr/generated/node/capture_node.rb +39 -0
  9. data/lib/packcr/generated/node/charclass_node.rb +372 -0
  10. data/lib/packcr/generated/node/eof_node.rb +20 -0
  11. data/lib/packcr/generated/node/error_node.rb +67 -0
  12. data/lib/packcr/generated/node/expand_node.rb +30 -0
  13. data/lib/packcr/generated/node/predicate_node.rb +140 -0
  14. data/lib/packcr/generated/node/quantity_node.rb +167 -0
  15. data/lib/packcr/generated/node/reference_node.rb +70 -0
  16. data/lib/packcr/generated/node/rule_node.rb +63 -0
  17. data/lib/packcr/generated/node/sequence_node.rb +42 -0
  18. data/lib/packcr/generated/node/string_node.rb +60 -0
  19. data/lib/packcr/generator.rb +2 -1
  20. data/lib/packcr/node/action_node.rb +4 -2
  21. data/lib/packcr/node/alternate_node.rb +3 -1
  22. data/lib/packcr/node/capture_node.rb +3 -1
  23. data/lib/packcr/node/charclass_node.rb +24 -28
  24. data/lib/packcr/node/eof_node.rb +4 -2
  25. data/lib/packcr/node/error_node.rb +3 -1
  26. data/lib/packcr/node/expand_node.rb +8 -5
  27. data/lib/packcr/node/predicate_node.rb +4 -2
  28. data/lib/packcr/node/quantity_node.rb +12 -10
  29. data/lib/packcr/node/reference_node.rb +11 -5
  30. data/lib/packcr/node/root_node.rb +1 -0
  31. data/lib/packcr/node/rule_node.rb +7 -4
  32. data/lib/packcr/node/sequence_node.rb +3 -1
  33. data/lib/packcr/node/string_node.rb +9 -6
  34. data/lib/packcr/node.rb +3 -5
  35. data/lib/packcr/parser.rb +4375 -4056
  36. data/lib/packcr/stream.rb +17 -12
  37. data/lib/packcr/templates/context/source.c.erb +187 -410
  38. data/lib/packcr/templates/context/source.rb.erb +91 -156
  39. data/lib/packcr/templates/node/action.c.erb +3 -3
  40. data/lib/packcr/templates/node/action.rb.erb +2 -2
  41. data/lib/packcr/templates/node/alternate.c.erb +8 -8
  42. data/lib/packcr/templates/node/alternate.rb.erb +4 -5
  43. data/lib/packcr/templates/node/capture.c.erb +6 -6
  44. data/lib/packcr/templates/node/capture.rb.erb +4 -4
  45. data/lib/packcr/templates/node/charclass.c.erb +12 -12
  46. data/lib/packcr/templates/node/charclass.rb.erb +6 -6
  47. data/lib/packcr/templates/node/charclass_any.c.erb +3 -3
  48. data/lib/packcr/templates/node/charclass_any.rb.erb +2 -2
  49. data/lib/packcr/templates/node/charclass_fail.c.erb +1 -1
  50. data/lib/packcr/templates/node/charclass_one.c.erb +8 -8
  51. data/lib/packcr/templates/node/charclass_one.rb.erb +6 -6
  52. data/lib/packcr/templates/node/charclass_utf8.c.erb +7 -7
  53. data/lib/packcr/templates/node/charclass_utf8.rb.erb +3 -3
  54. data/lib/packcr/templates/node/charclass_utf8_reverse.rb.erb +5 -5
  55. data/lib/packcr/templates/node/eof.c.erb +1 -1
  56. data/lib/packcr/templates/node/error.c.erb +7 -7
  57. data/lib/packcr/templates/node/error.rb.erb +2 -2
  58. data/lib/packcr/templates/node/expand.c.erb +5 -5
  59. data/lib/packcr/templates/node/expand.rb.erb +3 -3
  60. data/lib/packcr/templates/node/predicate.c.erb +10 -10
  61. data/lib/packcr/templates/node/predicate.rb.erb +6 -6
  62. data/lib/packcr/templates/node/predicate_neg.c.erb +8 -8
  63. data/lib/packcr/templates/node/predicate_neg.rb.erb +6 -6
  64. data/lib/packcr/templates/node/{quantify_many.c.erb → quantity_many.c.erb} +11 -11
  65. data/lib/packcr/templates/node/{quantify_many.rb.erb → quantity_many.rb.erb} +9 -9
  66. data/lib/packcr/templates/node/{quantify_one.c.erb → quantity_one.c.erb} +7 -7
  67. data/lib/packcr/templates/node/{quantify_one.rb.erb → quantity_one.rb.erb} +4 -4
  68. data/lib/packcr/templates/node/reference.c.erb +14 -2
  69. data/lib/packcr/templates/node/reference.rb.erb +16 -4
  70. data/lib/packcr/templates/node/reference_reverse.rb.erb +16 -4
  71. data/lib/packcr/templates/node/rule.c.erb +9 -2
  72. data/lib/packcr/templates/node/rule.rb.erb +26 -19
  73. data/lib/packcr/templates/node/string_many.c.erb +5 -5
  74. data/lib/packcr/templates/node/string_many.rb.erb +3 -3
  75. data/lib/packcr/templates/node/string_one.c.erb +4 -4
  76. data/lib/packcr/templates/node/string_one.rb.erb +3 -3
  77. data/lib/packcr/util.rb +21 -16
  78. data/lib/packcr/version.rb +1 -1
  79. data/lib/packcr.rb +8 -11
  80. metadata +37 -9
  81. data/lib/packcr/tokenizer.rb +0 -2948
@@ -18,59 +18,53 @@ class Packcr
18
18
  end
19
19
 
20
20
  def generate_code(gen, onfail, indent, bare, oncut: nil)
21
- if gen.ascii
22
- return generate_ascii_code(gen, onfail, indent, bare)
23
- else
24
- return generate_utf8_charclass_code(gen, onfail, indent, bare)
25
- end
21
+ return generate_ascii_code(gen, onfail, indent, bare) if gen.ascii
22
+
23
+ generate_utf8_charclass_code(gen, onfail, indent, bare)
26
24
  end
27
25
 
28
26
  def generate_reverse_code(gen, onsuccess, indent, bare, oncut: nil)
29
- if gen.ascii
30
- raise "unexpected"
31
- else
32
- return generate_utf8_charclass_reverse_code(gen, onsuccess, indent, bare)
33
- end
27
+ raise "unexpected" if gen.ascii
28
+
29
+ generate_utf8_charclass_reverse_code(gen, onsuccess, indent, bare)
34
30
  end
35
31
 
36
32
  def reachability
37
- charclass = self.value
33
+ charclass = value
38
34
  n = charclass&.length || 0
39
- if charclass.nil? || n > 0
40
- return Packcr::CODE_REACH__BOTH
41
- else
42
- return Packcr::CODE_REACH__ALWAYS_FAIL
43
- end
35
+ return Packcr::CODE_REACH__BOTH if charclass.nil? || n > 0
36
+
37
+ Packcr::CODE_REACH__ALWAYS_FAIL
44
38
  end
45
39
 
46
40
  private
47
41
 
48
42
  def generate_utf8_charclass_code(gen, onfail, indent, bare)
49
- charclass = self.value
43
+ charclass = value
50
44
  if charclass && charclass.encoding != Encoding::UTF_8
51
45
  charclass = charclass.dup.force_encoding(Encoding::UTF_8)
52
46
  end
53
47
  n = charclass&.length || 0
54
48
  if charclass.nil? || n > 0
55
- gen.write Packcr.template("node/charclass_utf8.#{gen.lang}.erb", binding, indent: indent, unwrap: bare)
49
+ gen.write Packcr.format_code(get_utf8_code(gen, onfail, indent, bare, charclass, n), indent: indent, unwrap: bare)
56
50
  else
57
- gen.write Packcr.template("node/charclass_fail.#{gen.lang}.erb", binding, indent: indent)
51
+ gen.write Packcr.format_code(get_fail_code(gen, onfail, indent, bare), indent: indent)
58
52
  end
59
53
  end
60
54
 
61
55
  def generate_utf8_charclass_reverse_code(gen, onsuccess, indent, bare)
62
- charclass = self.value
56
+ charclass = value
63
57
  if charclass && charclass.encoding != Encoding::UTF_8
64
58
  charclass = charclass.dup.force_encoding(Encoding::UTF_8)
65
59
  end
66
60
  n = charclass&.length || 0
67
- if charclass.nil? || n > 0
68
- gen.write Packcr.template("node/charclass_utf8_reverse.#{gen.lang}.erb", binding, indent: indent, unwrap: bare)
69
- end
61
+ return unless charclass.nil? || n > 0
62
+
63
+ gen.write Packcr.format_code(get_utf8_reverse_code(gen, onsuccess, indent, bare, charclass, n), indent: indent, unwrap: bare)
70
64
  end
71
65
 
72
66
  def generate_ascii_code(gen, onfail, indent, bare)
73
- charclass = self.value
67
+ charclass = value
74
68
  if charclass
75
69
  n = charclass.length
76
70
  a = charclass[0] == "^"
@@ -80,15 +74,15 @@ class Packcr
80
74
  end
81
75
  if n > 0
82
76
  if n > 1
83
- gen.write Packcr.template("node/charclass.#{gen.lang}.erb", binding, indent: indent, unwrap: bare)
77
+ gen.write Packcr.format_code(get_code(gen, onfail, indent, bare, charclass, n, a), indent: indent, unwrap: bare)
84
78
  else
85
- gen.write Packcr.template("node/charclass_one.#{gen.lang}.erb", binding, indent: indent)
79
+ gen.write Packcr.format_code(get_one_code(gen, onfail, indent, bare, charclass, n, a), indent: indent)
86
80
  end
87
81
  else
88
- gen.write Packcr.template("node/charclass_fail.#{gen.lang}.erb", binding, indent: indent)
82
+ gen.write Packcr.format_code(get_fail_code(gen, onfail, indent, bare), indent: indent)
89
83
  end
90
84
  else
91
- gen.write Packcr.template("node/charclass_any.#{gen.lang}.erb", binding, indent: indent)
85
+ gen.write Packcr.format_code(get_any_code(gen, onfail, indent, bare, charclass), indent: indent)
92
86
  end
93
87
  end
94
88
 
@@ -101,3 +95,5 @@ class Packcr
101
95
  end
102
96
  end
103
97
  end
98
+
99
+ require "packcr/generated/node/charclass_node"
@@ -6,11 +6,11 @@ class Packcr
6
6
  end
7
7
 
8
8
  def generate_code(gen, onfail, indent, bare, oncut: nil)
9
- gen.write Packcr.template("node/eof.#{gen.lang}.erb", binding, indent: indent, unwrap: bare)
9
+ gen.write Packcr.format_code(get_code(gen, onfail, indent, bare, oncut), indent: indent, unwrap: bare)
10
10
  end
11
11
 
12
12
  def reachability
13
- return Packcr::CODE_REACH__BOTH
13
+ Packcr::CODE_REACH__BOTH
14
14
  end
15
15
 
16
16
  def to_h
@@ -21,3 +21,5 @@ class Packcr
21
21
  end
22
22
  end
23
23
  end
24
+
25
+ require "packcr/generated/node/eof_node"
@@ -30,7 +30,7 @@ class Packcr
30
30
  end
31
31
 
32
32
  def generate_code(gen, onfail, indent, bare, oncut: nil)
33
- gen.write Packcr.template("node/error.#{gen.lang}.erb", binding, indent: indent, unwrap: bare)
33
+ gen.write Packcr.format_code(get_code(gen, onfail, indent, bare, oncut), indent: indent, unwrap: bare)
34
34
  end
35
35
 
36
36
  def reachability
@@ -68,3 +68,5 @@ class Packcr
68
68
  end
69
69
  end
70
70
  end
71
+
72
+ require "packcr/generated/node/error_node"
@@ -16,11 +16,11 @@ class Packcr
16
16
  end
17
17
 
18
18
  def generate_code(gen, onfail, indent, bare, oncut: nil)
19
- gen.write Packcr.template("node/expand.#{gen.lang}.erb", binding, indent: indent, unwrap: bare)
19
+ gen.write Packcr.format_code(get_code(gen, onfail, indent, bare, oncut), indent: indent, unwrap: bare)
20
20
  end
21
21
 
22
22
  def reachability
23
- return Packcr::CODE_REACH__BOTH
23
+ Packcr::CODE_REACH__BOTH
24
24
  end
25
25
 
26
26
  def verify_captures(ctx, capts)
@@ -28,11 +28,12 @@ class Packcr
28
28
  unless capt.is_a?(Packcr::Node::CaptureNode)
29
29
  raise "unexpected capture: #{capt.class}"
30
30
  end
31
+
31
32
  index == capt.index
32
33
  end
33
- if !found && index != nil
34
- ctx.error line + 1, col + 1, "Capture #{index + 1} not available at this position"
35
- end
34
+ return if found || index.nil?
35
+
36
+ ctx.error line + 1, col + 1, "Capture #{index + 1} not available at this position"
36
37
  end
37
38
 
38
39
  def to_h
@@ -44,3 +45,5 @@ class Packcr
44
45
  end
45
46
  end
46
47
  end
48
+
49
+ require "packcr/generated/node/expand_node"
@@ -17,9 +17,9 @@ class Packcr
17
17
 
18
18
  def generate_code(gen, onfail, indent, bare, oncut: nil)
19
19
  if neg
20
- gen.write Packcr.template("node/predicate_neg.#{gen.lang}.erb", binding, indent: indent, unwrap: bare)
20
+ gen.write Packcr.format_code(get_neg_code(gen, onfail, indent, bare, oncut), indent: indent, unwrap: bare)
21
21
  else
22
- gen.write Packcr.template("node/predicate.#{gen.lang}.erb", binding, indent: indent, unwrap: bare)
22
+ gen.write Packcr.format_code(get_code(gen, onfail, indent, bare, oncut), indent: indent, unwrap: bare)
23
23
  end
24
24
  end
25
25
 
@@ -45,3 +45,5 @@ class Packcr
45
45
  end
46
46
  end
47
47
  end
48
+
49
+ require "packcr/generated/node/predicate_node"
@@ -18,12 +18,12 @@ class Packcr
18
18
 
19
19
  def generate_code(gen, onfail, indent, bare, oncut: nil)
20
20
  if max > 1 || max < 0
21
- gen.write Packcr.template("node/quantify_many.#{gen.lang}.erb", binding, indent: indent, unwrap: bare)
21
+ gen.write Packcr.format_code(get_many_code(gen, onfail, indent, bare, oncut), indent: indent, unwrap: bare)
22
22
  elsif max == 1
23
23
  if min > 0
24
- gen.write gen.generate_code(expr, onfail, indent, bare)
24
+ gen.write gen.generate_code(expr, onfail, indent, bare, oncut: oncut)
25
25
  else
26
- gen.write Packcr.template("node/quantify_one.#{gen.lang}.erb", binding, indent: indent, unwrap: bare)
26
+ gen.write Packcr.format_code(get_one_code(gen, onfail, indent, bare, oncut), indent: indent, unwrap: bare)
27
27
  end
28
28
  end
29
29
  end
@@ -36,15 +36,15 @@ class Packcr
36
36
  if expr.reachability == Packcr::CODE_REACH__ALWAYS_FAIL
37
37
  return Packcr::CODE_REACH__ALWAYS_FAIL
38
38
  end
39
- return Packcr::CODE_REACH__BOTH
39
+
40
+ Packcr::CODE_REACH__BOTH
40
41
  elsif max == 1
41
- if min > 0
42
- return expr.reachability
43
- else
44
- return Packcr::CODE_REACH__ALWAYS_SUCCEED
45
- end
42
+ return expr.reachability if min > 0
43
+
44
+ Packcr::CODE_REACH__ALWAYS_SUCCEED
45
+
46
46
  else
47
- return Packcr::CODE_REACH__ALWAYS_SUCCEED
47
+ Packcr::CODE_REACH__ALWAYS_SUCCEED
48
48
  end
49
49
  end
50
50
 
@@ -63,3 +63,5 @@ class Packcr
63
63
  end
64
64
  end
65
65
  end
66
+
67
+ require "packcr/generated/node/quantity_node"
@@ -21,11 +21,11 @@ class Packcr
21
21
  end
22
22
 
23
23
  def generate_code(gen, onfail, indent, bare, oncut: nil)
24
- gen.write Packcr.template("node/reference.#{gen.lang}.erb", binding, indent: indent)
24
+ gen.write Packcr.format_code(get_code(gen, onfail, indent, bare, oncut), indent: indent, unwrap: bare)
25
25
  end
26
26
 
27
27
  def generate_reverse_code(gen, onsuccess, indent, bare, oncut: nil)
28
- gen.write Packcr.template("node/reference_reverse.#{gen.lang}.erb", binding, indent: indent)
28
+ gen.write Packcr.format_code(get_reverse_code(gen, onsuccess, indent, bare, oncut), indent: indent)
29
29
  end
30
30
 
31
31
  def reachability
@@ -34,10 +34,12 @@ class Packcr
34
34
 
35
35
  def setup_rule(rule)
36
36
  return unless var
37
+
37
38
  i = rule.vars.index do |ref|
38
39
  unless ref.is_a?(Packcr::Node::ReferenceNode)
39
40
  raise "Unexpected node type: #{ref.class}"
40
41
  end
42
+
41
43
  var == ref.var
42
44
  end
43
45
  if !i
@@ -54,6 +56,7 @@ class Packcr
54
56
  unless var.is_a?(Packcr::Node::ReferenceNode)
55
57
  raise "unexpected var: #{var.class}"
56
58
  end
59
+
57
60
  index == var.index
58
61
  end
59
62
  vars.push(self) if !found
@@ -61,14 +64,15 @@ class Packcr
61
64
 
62
65
  def link_references(ctx)
63
66
  rule = ctx.root.rule(name)
64
- if !rule
65
- ctx.error line + 1, col + 1, "No definition of rule '#{name}'"
66
- else
67
+ if rule
67
68
  unless rule.is_a?(Packcr::Node::RuleNode)
68
69
  raise "unexpected node type #{rule.class}"
69
70
  end
71
+
70
72
  rule.add_ref
71
73
  self.rule = rule
74
+ else
75
+ ctx.error line + 1, col + 1, "No definition of rule '#{name}'"
72
76
  end
73
77
  end
74
78
 
@@ -82,3 +86,5 @@ class Packcr
82
86
  end
83
87
  end
84
88
  end
89
+
90
+ require "packcr/generated/node/reference_node"
@@ -38,6 +38,7 @@ class Packcr
38
38
  def rule(name)
39
39
  rule = @rulehash[name]
40
40
  return rule if rule
41
+
41
42
  case name
42
43
  when "EOF"
43
44
  expr = Packcr::Node::EofNode.new
@@ -22,7 +22,7 @@ class Packcr
22
22
  end
23
23
 
24
24
  def generate_code(gen, onfail, indent, bare, oncut: nil)
25
- gen.write Packcr.template("node/rule.#{gen.lang}.erb", binding, indent: indent, unwrap: bare)
25
+ gen.write Packcr.format_code(get_code(gen, onfail, indent, bare, oncut), indent: indent, unwrap: bare)
26
26
  end
27
27
 
28
28
  def reachability
@@ -37,9 +37,10 @@ class Packcr
37
37
 
38
38
  def verify_rule_reference(ctx)
39
39
  return if top
40
- if ref == 0
41
- ctx.error line + 1, col + 1, "Never used rule '#{name}'"
42
- end
40
+
41
+ return unless ref == 0
42
+
43
+ ctx.error line + 1, col + 1, "Never used rule '#{name}'"
43
44
  end
44
45
 
45
46
  def add_ref
@@ -63,3 +64,5 @@ class Packcr
63
64
  end
64
65
  end
65
66
  end
67
+
68
+ require "packcr/generated/node/rule_node"
@@ -54,7 +54,7 @@ class Packcr
54
54
  end
55
55
 
56
56
  def generate_code(gen, onfail, indent, bare, oncut: nil)
57
- gen.write Packcr.template("node/sequence.#{gen.lang}.erb", binding, indent: indent)
57
+ gen.write Packcr.format_code(get_code(gen, onfail, indent, bare, oncut), indent: indent)
58
58
  end
59
59
 
60
60
  def reachability
@@ -79,3 +79,5 @@ class Packcr
79
79
  end
80
80
  end
81
81
  end
82
+
83
+ require "packcr/generated/node/sequence_node"
@@ -19,12 +19,12 @@ class Packcr
19
19
 
20
20
  def generate_code(gen, onfail, indent, bare, oncut: nil)
21
21
  n = value&.length || 0
22
- if n > 0
23
- if n > 1
24
- gen.write Packcr.template("node/string_many.#{gen.lang}.erb", binding, indent: indent)
25
- else
26
- gen.write Packcr.template("node/string_one.#{gen.lang}.erb", binding, indent: indent)
27
- end
22
+ return unless n > 0
23
+
24
+ if n > 1
25
+ gen.write Packcr.format_code(get_many_code(gen, onfail, indent, bare, oncut, n), indent: indent)
26
+ else
27
+ gen.write Packcr.format_code(get_one_code(gen, onfail, indent, bare, oncut, n), indent: indent)
28
28
  end
29
29
  end
30
30
 
@@ -33,6 +33,7 @@ class Packcr
33
33
  if n <= 0
34
34
  return Packcr::CODE_REACH__ALWAYS_SUCCEED
35
35
  end
36
+
36
37
  Packcr::CODE_REACH__BOTH
37
38
  end
38
39
 
@@ -45,3 +46,5 @@ class Packcr
45
46
  end
46
47
  end
47
48
  end
49
+
50
+ require "packcr/generated/node/string_node"
data/lib/packcr/node.rb CHANGED
@@ -20,11 +20,9 @@ class Packcr
20
20
  end
21
21
  end
22
22
 
23
- def link_references(ctx)
24
- end
23
+ def link_references(ctx); end
25
24
 
26
- def setup_rule(rule)
27
- end
25
+ def setup_rule(rule); end
28
26
 
29
27
  def setup(ctx, rule)
30
28
  setup_rule(rule)
@@ -39,7 +37,7 @@ class Packcr
39
37
  []
40
38
  end
41
39
 
42
- def reversible?(gen)
40
+ def reversible?(_gen)
43
41
  false
44
42
  end
45
43