packcr 0.0.6 → 0.0.7

Sign up to get free protection for your applications and to get access to all the features.
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