packcr 0.0.4 → 0.0.7

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