packcr 0.0.4 → 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 (88) hide show
  1. checksums.yaml +4 -4
  2. data/exe/packcr +3 -0
  3. data/lib/packcr/broadcast.rb +17 -0
  4. data/lib/packcr/cli.rb +27 -0
  5. data/lib/packcr/code_block.rb +2 -4
  6. data/lib/packcr/context.rb +66 -61
  7. data/lib/packcr/generated/context.rb +440 -0
  8. data/lib/packcr/generated/node/action_node.rb +60 -0
  9. data/lib/packcr/generated/node/alternate_node.rb +98 -0
  10. data/lib/packcr/generated/node/capture_node.rb +39 -0
  11. data/lib/packcr/generated/node/charclass_node.rb +372 -0
  12. data/lib/packcr/generated/node/eof_node.rb +20 -0
  13. data/lib/packcr/generated/node/error_node.rb +67 -0
  14. data/lib/packcr/generated/node/expand_node.rb +30 -0
  15. data/lib/packcr/generated/node/predicate_node.rb +140 -0
  16. data/lib/packcr/generated/node/quantity_node.rb +167 -0
  17. data/lib/packcr/generated/node/reference_node.rb +70 -0
  18. data/lib/packcr/generated/node/rule_node.rb +63 -0
  19. data/lib/packcr/generated/node/sequence_node.rb +42 -0
  20. data/lib/packcr/generated/node/string_node.rb +60 -0
  21. data/lib/packcr/generator.rb +14 -11
  22. data/lib/packcr/node/action_node.rb +18 -7
  23. data/lib/packcr/node/alternate_node.rb +22 -12
  24. data/lib/packcr/node/capture_node.rb +14 -12
  25. data/lib/packcr/node/charclass_node.rb +44 -24
  26. data/lib/packcr/node/eof_node.rb +25 -0
  27. data/lib/packcr/node/error_node.rb +20 -13
  28. data/lib/packcr/node/expand_node.rb +18 -9
  29. data/lib/packcr/node/predicate_node.rb +19 -26
  30. data/lib/packcr/node/quantity_node.rb +31 -24
  31. data/lib/packcr/node/reference_node.rb +31 -9
  32. data/lib/packcr/node/root_node.rb +61 -0
  33. data/lib/packcr/node/rule_node.rb +29 -3
  34. data/lib/packcr/node/sequence_node.rb +48 -31
  35. data/lib/packcr/node/string_node.rb +19 -16
  36. data/lib/packcr/node.rb +34 -5
  37. data/lib/packcr/parser.rb +4493 -3896
  38. data/lib/packcr/stream.rb +22 -22
  39. data/lib/packcr/templates/context/header.c.erb +29 -0
  40. data/lib/packcr/templates/context/source.c.erb +1069 -0
  41. data/lib/packcr/templates/context/source.rb.erb +341 -0
  42. data/lib/packcr/templates/node/action.c.erb +16 -0
  43. data/lib/packcr/templates/node/action.rb.erb +21 -0
  44. data/lib/packcr/templates/node/alternate.c.erb +34 -0
  45. data/lib/packcr/templates/node/alternate.rb.erb +39 -0
  46. data/lib/packcr/templates/node/capture.c.erb +17 -0
  47. data/lib/packcr/templates/node/capture.rb.erb +14 -0
  48. data/lib/packcr/templates/node/charclass.c.erb +47 -0
  49. data/lib/packcr/templates/node/charclass.rb.erb +49 -0
  50. data/lib/packcr/templates/node/charclass_any.c.erb +5 -0
  51. data/lib/packcr/templates/node/charclass_any.rb.erb +7 -0
  52. data/lib/packcr/templates/node/charclass_fail.c.erb +1 -0
  53. data/lib/packcr/templates/node/charclass_fail.rb.erb +1 -0
  54. data/lib/packcr/templates/node/charclass_one.c.erb +19 -0
  55. data/lib/packcr/templates/node/charclass_one.rb.erb +23 -0
  56. data/lib/packcr/templates/node/charclass_utf8.c.erb +49 -0
  57. data/lib/packcr/templates/node/charclass_utf8.rb.erb +50 -0
  58. data/lib/packcr/templates/node/charclass_utf8_reverse.rb.erb +51 -0
  59. data/lib/packcr/templates/node/eof.c.erb +1 -0
  60. data/lib/packcr/templates/node/eof.rb.erb +3 -0
  61. data/lib/packcr/templates/node/error.c.erb +28 -0
  62. data/lib/packcr/templates/node/error.rb.erb +34 -0
  63. data/lib/packcr/templates/node/expand.c.erb +16 -0
  64. data/lib/packcr/templates/node/expand.rb.erb +16 -0
  65. data/lib/packcr/templates/node/predicate.c.erb +30 -0
  66. data/lib/packcr/templates/node/predicate.rb.erb +28 -0
  67. data/lib/packcr/templates/node/predicate_neg.c.erb +23 -0
  68. data/lib/packcr/templates/node/predicate_neg.rb.erb +22 -0
  69. data/lib/packcr/templates/node/quantity_many.c.erb +45 -0
  70. data/lib/packcr/templates/node/quantity_many.rb.erb +47 -0
  71. data/lib/packcr/templates/node/quantity_one.c.erb +21 -0
  72. data/lib/packcr/templates/node/quantity_one.rb.erb +23 -0
  73. data/lib/packcr/templates/node/reference.c.erb +17 -0
  74. data/lib/packcr/templates/node/reference.rb.erb +21 -0
  75. data/lib/packcr/templates/node/reference_reverse.rb.erb +21 -0
  76. data/lib/packcr/templates/node/rule.c.erb +26 -0
  77. data/lib/packcr/templates/node/rule.rb.erb +30 -0
  78. data/lib/packcr/templates/node/sequence.c.erb +12 -0
  79. data/lib/packcr/templates/node/sequence.rb.erb +12 -0
  80. data/lib/packcr/templates/node/string_many.c.erb +11 -0
  81. data/lib/packcr/templates/node/string_many.rb.erb +10 -0
  82. data/lib/packcr/templates/node/string_one.c.erb +8 -0
  83. data/lib/packcr/templates/node/string_one.rb.erb +10 -0
  84. data/lib/packcr/util.rb +21 -24
  85. data/lib/packcr/version.rb +1 -1
  86. data/lib/packcr.rb +9 -13
  87. metadata +117 -10
  88. data/lib/packcr/buffer.rb +0 -47
data/lib/packcr/stream.rb CHANGED
@@ -1,10 +1,9 @@
1
1
  require "securerandom"
2
- require "stringio"
3
2
 
4
3
  class Packcr
5
4
  class Stream
6
- def initialize(io, name, line)
7
- @io = io
5
+ def initialize(stream, name, line)
6
+ @stream = stream
8
7
  @name = name
9
8
  @line = line
10
9
  @line_directive_tag = nil
@@ -12,13 +11,13 @@ class Packcr
12
11
 
13
12
  def write(s, rewrite_line_directive: false)
14
13
  if rewrite_line_directive && @line_directive_tag && @line.respond_to?(:+)
15
- s.gsub!(@line_directive_tag) { (@line + $`.count("\n") + 1).to_s }
14
+ s.gsub!(@line_directive_tag) { (@line + ::Regexp.last_match.pre_match.count("\n") + 1).to_s }
16
15
  @line_directive_tag = nil
17
16
  end
18
- @io.write(s)
19
- if @line.respond_to?(:+)
20
- @line += s.count("\n")
21
- end
17
+ @stream << s
18
+ return unless @line.respond_to?(:+)
19
+
20
+ @line += s.count("\n")
22
21
  end
23
22
 
24
23
  def write_text(s)
@@ -27,6 +26,7 @@ class Packcr
27
26
 
28
27
  def write_line_directive(fname, lineno)
29
28
  return unless @line
29
+
30
30
  if lineno.respond_to?(:+)
31
31
  write("#line #{lineno + 1} \"")
32
32
  else
@@ -45,22 +45,18 @@ class Packcr
45
45
  def write_code_block(code, indent, fname)
46
46
  text = code.text
47
47
  ptr = text.b
48
- len = code.len
49
48
  lineno = code.line
50
- if len == nil
51
- return # for safety
52
- end
53
49
 
54
50
  ptr.sub!(/\A\n+/) do
55
- lineno += $&.length
51
+ lineno += ::Regexp.last_match(0).length
56
52
  ""
57
53
  end
58
54
  ptr.sub!(/[ \v\f\t\r\n]*\z/, "")
59
55
 
60
56
  min_indent_spaces = nil
61
57
  ptr.gsub!(/^([ \v\f\t]*)([^ \v\f\t\r\n])/) do
62
- spaces = $1
63
- char = $2
58
+ spaces = ::Regexp.last_match(1)
59
+ char = ::Regexp.last_match(2)
64
60
 
65
61
  next char if char == "#"
66
62
 
@@ -76,7 +72,7 @@ class Packcr
76
72
  if min_indent_spaces
77
73
  indent_spaces = " " * indent
78
74
  ptr.gsub!(/^#{min_indent_spaces}( *[^\n#])/) do
79
- "#{indent_spaces}#{$1}"
75
+ "#{indent_spaces}#{::Regexp.last_match(1)}"
80
76
  end
81
77
  end
82
78
 
@@ -84,19 +80,23 @@ class Packcr
84
80
 
85
81
  write_line_directive(fname, lineno)
86
82
  ptr.scan(/^(.+?)[ \v\f\t\r]*$|^\r?\n/) do
87
- write $1 if $1
83
+ write ::Regexp.last_match(1) if ::Regexp.last_match(1)
88
84
  write "\n"
89
85
  end
90
86
  write_output_line_directive
91
87
  end
92
88
 
93
89
  def get_code_block(code, indent, fname)
94
- buf = StringIO.new
95
- line, io, @io, @line = @line, @io, buf, @line && :uuid
90
+ buf = +""
91
+ line = @line
92
+ stream = @stream
93
+ @stream = buf
94
+ @line &&= :uuid
96
95
  write_code_block(code, indent, fname)
97
- return buf.string
96
+ buf
98
97
  ensure
99
- @line, @io = line, io
98
+ @line = line
99
+ @stream = stream
100
100
  end
101
101
  end
102
- end
102
+ end
@@ -0,0 +1,29 @@
1
+ /* A packrat parser generated by PackCR <%= Packcr::VERSION %> */
2
+
3
+ <%- code(:eheader).each do |code| -%>
4
+ <%= stream.get_code_block(code, 0, @iname) -%>
5
+ <%- end -%>
6
+ <%- if !code(:eheader).empty? -%>
7
+
8
+ <%- end -%>
9
+ #ifndef PCC_INCLUDED_<%= @hid %>
10
+ #define PCC_INCLUDED_<%= @hid %>
11
+
12
+ <%- code(:header).each do |code| -%>
13
+ <%= stream.get_code_block(code, 0, @iname) -%>
14
+ <%- end -%>
15
+ #ifdef __cplusplus
16
+ extern "C" {
17
+ #endif
18
+
19
+ typedef struct <%= prefix %>_context_tag <%= prefix %>_context_t;
20
+
21
+ <%= prefix %>_context_t *<%= prefix %>_create(<%= auxil_def %>auxil);
22
+ int <%= prefix %>_parse(<%= prefix %>_context_t *ctx, <%= value_def %>*ret);
23
+ void <%= prefix %>_destroy(<%= prefix %>_context_t *ctx);
24
+
25
+ #ifdef __cplusplus
26
+ }
27
+ #endif
28
+
29
+ #endif /* !PCC_INCLUDED_<%= @hid %> */