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
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b00f2dcd94c63af9d03206e51dbb951778f35cf44a8e4644025f8fb5f59043e2
4
- data.tar.gz: d03d48555f0dfb6086acb7198050defe1e0eea025fca279ef9fc85491803f83b
3
+ metadata.gz: c7f6f8510a8922ec8a3f379de4470af6889a01a0f98aebf46b69f16e2c398c64
4
+ data.tar.gz: aa728bb984a9a343c71099fe6652b7a37c5a3a20b535ad6d5cbc29feaaa776d0
5
5
  SHA512:
6
- metadata.gz: a06709977ca0f8a12529668b2ae879f5a713798a35daaf27a76038560cf949817d128f47f019b2ef59ce347f61021415806343646f4835dd239e9965e4dd1814
7
- data.tar.gz: f4de00a9453f68af3eeefb2b07792ff1cfd3748dd21aaa96fb859ec57a13bd4fd7c63931c7695ee8e2c13256f6d8a17ff694de8e48df809d7e33582f0861d8c7
6
+ metadata.gz: ceee0d72c7fa96a8a71fd76d8015591f70c4ba321242966ed295522d55e37e2ce71cf8ab51bda644971f5b0ad675c4c0dbdd225e8f2eded2d5eb8f5a3957922f
7
+ data.tar.gz: fd819a73b1b16827316ddef020068383952cf6d188ac728f5d06157330b49b0010561552676fce3652cc90b0f838f7750242622b83d0677335e6bc6235199d4f
data/exe/packcr ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env ruby
2
+ require "packcr/cli"
3
+ Packcr::Cli.run(ARGV)
@@ -0,0 +1,17 @@
1
+ class Packcr
2
+ class BroadCast
3
+ def initialize(*arrays)
4
+ @arrays = arrays
5
+ end
6
+
7
+ def <<(obj)
8
+ @arrays.each do |array|
9
+ array << obj
10
+ end
11
+ end
12
+
13
+ def to_ary
14
+ @arrays
15
+ end
16
+ end
17
+ end
data/lib/packcr/cli.rb ADDED
@@ -0,0 +1,27 @@
1
+ require "packcr"
2
+ require "optparse"
3
+
4
+ class Packcr
5
+ class Cli
6
+ class << self
7
+ def run(argv)
8
+ new.run(argv)
9
+ end
10
+ end
11
+
12
+ def run(argv)
13
+ lang = nil
14
+ debug = false
15
+ ascii = false
16
+ opt = OptionParser.new
17
+ opt.on("-l", "--lang=VAL") { |v| lang = v.to_sym }
18
+ opt.on("-d", "--debug") { |_v| debug = true }
19
+ opt.on("-a", "--ascii") { |_v| ascii = true }
20
+
21
+ opt.parse!(argv)
22
+ argv.each do |ifile|
23
+ ::Packcr.new(ifile, lang: lang, debug: debug, ascii: ascii).run
24
+ end
25
+ end
26
+ end
27
+ end
@@ -1,11 +1,9 @@
1
-
2
1
  class Packcr
3
2
  class CodeBlock
4
- attr_reader :text, :len, :line
3
+ attr_reader :text, :line
5
4
 
6
- def initialize(text = nil, len = 0, line = nil, col = nil)
5
+ def initialize(text = nil, line = nil, col = nil)
7
6
  @text = text
8
- @len = len
9
7
  @line = line
10
8
  @col = col
11
9
  end
@@ -1,15 +1,20 @@
1
+ require "tempfile"
1
2
  require "packcr/parser"
3
+ require "packcr/broadcast"
2
4
 
3
5
  class Packcr
4
- class Context < Packcr::Parser
6
+ class Context
7
+ attr_reader :lang, :root
8
+ attr_accessor :prefix, :auxil_type, :value_type, :errnum, :capture_in_code
9
+
5
10
  def initialize(path, lines: false, debug: false, ascii: false, lang: nil)
6
- super(debug: debug)
7
11
  if !path
8
12
  raise ArgumentError, "bad path: #{path}";
9
13
  end
10
14
 
11
15
  @iname = path
12
- @ifile = File.open(path, "rb")
16
+ @debug = debug
17
+
13
18
  dirname = File.dirname(path)
14
19
  basename = File.basename(path, ".*")
15
20
  if !lang
@@ -29,42 +34,40 @@ class Packcr
29
34
  @lang = lang.to_sym
30
35
  case @lang
31
36
  when :c
32
- @sname = path + ".c"
33
- @hname = path + ".h"
37
+ @hname = "#{path}.h"
38
+ @patterns = {
39
+ get_source_code: "#{path}.c",
40
+ get_header_code: @hname,
41
+ }
34
42
  @hid = File.basename(@hname).upcase.gsub(/[^A-Z0-9]/, "_")
35
43
  when :rb
36
- @sname = path + ".rb"
37
- @hname = nil
44
+ @patterns = {
45
+ get_source_code: "#{path}.rb",
46
+ }
38
47
  else
39
48
  raise "unexpected lang: #{@lang}"
40
49
  end
41
50
 
42
51
  @lines = !!lines
43
52
  @ascii = !!ascii
53
+ @utf8 = !ascii
44
54
 
45
55
  @errnum = 0
46
- @linenum = 0
47
- @charnum = 0
48
- @linepos = 0
49
- @bufpos = 0
50
- @bufcur = 0
51
-
52
- @esource = []
53
- @eheader = []
54
- @source = []
55
- @header = []
56
- @lheader = []
57
- @lsource = []
58
- @location = []
59
- @init = []
60
-
61
- if block_given?
62
- yield(self)
63
- end
56
+
57
+ @codes = {}
58
+ @root = Node::RootNode.new
59
+
60
+ return unless block_given?
61
+
62
+ yield(self)
63
+ end
64
+
65
+ def code(name)
66
+ @codes[name] ||= []
64
67
  end
65
68
 
66
69
  def inspect
67
- "#<#{self.class}:0x%016x>" % object_id
70
+ format("#<%s:0x%016x>", self.class, object_id)
68
71
  end
69
72
 
70
73
  def error(line, col, message)
@@ -84,8 +87,17 @@ class Packcr
84
87
  @prefix || "pcc"
85
88
  end
86
89
 
90
+ def pass_value_code(var)
91
+ case @lang
92
+ when :c
93
+ "__ = #{var};"
94
+ when :rb
95
+ "____ = #{var}"
96
+ end
97
+ end
98
+
87
99
  def class_name
88
- prefix.gsub(/(?:_|^|(\W))([a-z])/) { "#{$1}#{$2}".upcase }
100
+ prefix.gsub(/(?:_|^|(\W))([a-z])/) { "#{::Regexp.last_match(1)}#{::Regexp.last_match(2)}".upcase }
89
101
  end
90
102
 
91
103
  def auxil_def
@@ -106,33 +118,20 @@ class Packcr
106
118
  EOS
107
119
  end
108
120
 
109
- def parse
110
- $stdin = @ifile
111
- nil while super
112
-
113
- if @location.empty?
114
- @location = nil
121
+ def parse_all
122
+ File.open(@iname, "rb") do |r|
123
+ parser = Packcr::Parser.new(self, r, debug: @debug)
124
+ nil while parser.parse
115
125
  end
116
126
 
117
- make_rulehash
118
- @rules.each do |rule|
119
- rule.setup
120
- rule.expr.link_references(self)
121
- end
122
- @rules[1..-1]&.each do |rule|
123
- if rule.ref == 0
124
- error rule.line + 1, rule.col + 1, "Never used rule '#{rule.name}'"
125
- elsif rule.ref < 0 # impossible?
126
- error rule.line + 1, rule.col + 1, "Multiple definition of rule '#{rule.name}'"
127
- end
127
+ if !code(:location).empty?
128
+ @location = true
128
129
  end
129
130
 
130
- @rules.each do |rule|
131
- rule.verify(self)
132
- end
131
+ @root.setup(self)
133
132
 
134
133
  if @debug
135
- @rules.each(&:debug_dump)
134
+ @root.debug_dump
136
135
  dump_options
137
136
  end
138
137
 
@@ -140,26 +139,32 @@ class Packcr
140
139
  end
141
140
 
142
141
  def generate
143
- if @hname
144
- File.open(@hname, "wt") do |hio|
145
- hstream = ::Packcr::Stream.new(hio, @hname, @lines ? 0 : nil)
142
+ results = []
146
143
 
147
- hstream.write Packcr.template("context/header.#{@lang}.erb", binding), rewrite_line_directive: true
148
- end
149
- end
144
+ @patterns.each do |meth, ofile|
145
+ result = Tempfile.new
146
+ result.unlink
147
+ results << [ofile, result]
148
+ stream = Packcr::Stream.new(result, ofile, @lines ? 0 : nil)
149
+ stream.write Packcr.format_code(public_send(meth, @lang, stream)), rewrite_line_directive: true
150
150
 
151
- File.open(@sname, "wt") do |sio|
152
- sstream = ::Packcr::Stream.new(sio, @sname, @lines ? 0 : nil)
151
+ next if @errnum.zero?
153
152
 
154
- sstream.write Packcr.template("context/source.#{@lang}.erb", binding), rewrite_line_directive: true
153
+ results.each do |_, r|
154
+ r.close
155
+ end
156
+ return false
155
157
  end
156
158
 
157
- if !@errnum.zero?
158
- File.unlink(@hname) if @name
159
- File.unlink(@sname)
160
- return false
159
+ results.each do |(name, result)|
160
+ result.rewind
161
+ File.open(name, "wt") do |f|
162
+ IO.copy_stream(result, f)
163
+ end
161
164
  end
162
165
  true
163
166
  end
164
167
  end
165
168
  end
169
+
170
+ require "packcr/generated/context"