rbdtb 1.0.0

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 (3) hide show
  1. checksums.yaml +7 -0
  2. data/lib/rbdtb.rb +330 -0
  3. metadata +85 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: e360ceb51912ae492eac5199a8157e3280cd041a6239337b0040de16dce16161
4
+ data.tar.gz: e8c6969878a76c2f5eb86ad2bfc729a3c39002d0852666b058167c5e250c5e6b
5
+ SHA512:
6
+ metadata.gz: db8a03ac9dcab1f620b556674ab4514ed00812961ecc95465cd478e21455667ea3216c1c0217d4a8a45a8ebad2b2b02b3a0c0d0b13fd8c1459d3a4369173573f
7
+ data.tar.gz: 214ecfca60b49436d7633f103641fa357d97e9596bd82490a2b6b6b3aeabeefac0bb74449cd0f993693ae1ba89656576a51615b6df85236fe7e4a843fc4b5269
data/lib/rbdtb.rb ADDED
@@ -0,0 +1,330 @@
1
+ require 'awesome_print'
2
+ require 'rly'
3
+ require 'logger'
4
+ require 'pathname'
5
+
6
+ $log = Logger.new(STDOUT)
7
+ $log.level = Logger::WARN
8
+
9
+
10
+ class DTBLex < Rly::Lex
11
+ literals "=():;,{}+"
12
+ ignore " \t\n"
13
+
14
+ token :HEX, /0[x|X]\d+/ do |t|
15
+ t
16
+ end
17
+
18
+ token :NUMBER, /\d+/ do |t|
19
+ t.value = t.value.to_i
20
+ t
21
+ end
22
+
23
+
24
+ token :COMMENTS, /\/\*((?!\/\*).)+\*\// do |t|
25
+ t
26
+ end
27
+
28
+ token :VERSION, /\/dts-v\d+\/;/ do |t|
29
+ t
30
+ end
31
+
32
+ token :ROOT, /\/\s+/ do |t|
33
+ t
34
+ end
35
+
36
+ token :SINGLESTRING, /\"[^\"]+\"/ do |t|
37
+ t
38
+ end
39
+
40
+ token :BINARYDATA, /\[[^\[]+\]/ do |t|
41
+ t
42
+ end
43
+
44
+ token :CELLDATA, /<[^<]+>/ do |t|
45
+ t
46
+ end
47
+
48
+ token :DATA, /[a-zA-Z_][@a-zA-Z0-9_-]*/ do |t|
49
+ t
50
+ end
51
+
52
+ token :DATA, /[#\/a-zA-Z_][a-zA-Z0-9_-]*\.[\/a-zA-Z_]*/ do |t|
53
+ t
54
+ end
55
+
56
+ token :DATA, /[\/#a-zA-Z_][@\/a-zA-Z0-9_-]*/ do |t|
57
+ t
58
+ end
59
+
60
+ token :BITS, /\/bits\// do |t|
61
+ t
62
+ end
63
+
64
+ token :REFERENCE, /&[a-zA-Z_][a-zA-Z0-9_-]*/ do |t|
65
+ t
66
+ end
67
+
68
+ on_error do |t|
69
+ puts "Illegal character #{t.value}"
70
+ t.lexer.pos += 1
71
+ nil
72
+ end
73
+
74
+ def show()
75
+ while tok = self.next do
76
+ puts "#{tok.type} -> #{tok.value}"
77
+ end
78
+ end
79
+ end
80
+
81
+
82
+ class DTBParse < Rly::Yacc
83
+ def stack
84
+ @stack ||= {}
85
+ end
86
+
87
+ rule 'statement : expression' do |st, ex|
88
+ st.value = ex.value
89
+ $log.info "statement #{st.value}"
90
+ end
91
+
92
+ rule 'expression : VERSION expression' do |ex, v, e|
93
+ ex.value = {"version" => v.value}.merge(e.value)
94
+ $log.info "expression VERSION e #{ex.value}"
95
+ end
96
+
97
+ rule 'expression : expression "=" expression ' do |ex, e1, _, e2|
98
+ ex.value = {e1.value => e2.value}
99
+ $log.info "expression = #{ex.value}"
100
+ end
101
+
102
+ rule 'expression : DATA "{" "}"' do |ex, d, _, _|
103
+ ex.value = { d.value => "" }
104
+ $log.info "rule data { } #{ex.value}"
105
+ end
106
+
107
+ rule 'expression : ROOT "{" expression "}" ' do |ex, _, _, e, _|
108
+ ex.value = {"root" => e.value.merge(self.stack)}
109
+ self.stack.clear()
110
+ $log.info "rule \/ { e } #{ex.value}"
111
+ end
112
+
113
+ rule 'expression : DATA "{" expression "}"' do |ex, d, _, e, _|
114
+ if e.value.class == Hash
115
+ ex.value = {d.value => e.value.merge(self.stack)}
116
+ else
117
+ data = {e.value => ''}
118
+ ex.value = {d.value => data.merge(self.stack)}
119
+ end
120
+ self.stack.clear()
121
+ $log.info "rule data { e } #{ex.value}"
122
+ end
123
+
124
+ rule 'expression : NUMBER "{" expression "}"' do |ex, d, _, e, _|
125
+ if e.value.class == Hash
126
+ ex.value = {d.value => e.value.merge(self.stack)}
127
+ else
128
+ data = {e.value => ''}
129
+ ex.value = {d.value => data.merge(self.stack)}
130
+ end
131
+ self.stack.clear()
132
+ $log.info "rule NUMBER { e } #{ex.value}"
133
+ end
134
+
135
+
136
+ rule 'expression : "{" expression "}"' do |ex, _, e, _|
137
+ if e.value.class == Hash
138
+ ex.value = e.value.merge(self.stack)
139
+ else
140
+ data = {e.value => ''}
141
+ ex.value = self.stack
142
+ end
143
+ self.stack.clear()
144
+ $log.info "rule { e } #{ex.value}"
145
+ end
146
+
147
+ rule 'expression : BITS expression' do |ex, _, e1,|
148
+ ex.value = e1.value.to_s
149
+ $log.info "rule BITS expression #{ex.value}"
150
+ end
151
+
152
+ rule 'expression : DATA DATA' do |ex, e1, e2,|
153
+ ex.value = e1.value + " " + e2.value
154
+ $log.info "rule DATA DATA #{ex.value}"
155
+ end
156
+
157
+ rule 'expression : expression ":" expression' do |ex, e1, op, e2|
158
+ ex.value = {e1.value => e2.value}
159
+ $log.info "rule e : e #{ex.value}"
160
+ end
161
+
162
+ rule 'expression : DATA "," expression' do |ex, d, _, e|
163
+ if e.value.class == Hash
164
+ mh = { d.value + "," + e.value.keys()[0].to_s => e.value.values()[0] }
165
+ ex.value = mh
166
+ else
167
+ ex.value = {d.value => e.value}
168
+ end
169
+ $log.info "rule DATA , expression #{ex.value}"
170
+ end
171
+
172
+ rule 'expression : expression "," expression' do |ex, e1, op, e2|
173
+ tv1 = [ ]
174
+ if e1.value.class == Array
175
+ tv1 = e1.value
176
+ else
177
+ tv1 = [e1.value]
178
+ end
179
+ tv2 = []
180
+ if e2.value.class == Array
181
+ tv2 = e2.value
182
+ else
183
+ tv2 = [e2.value]
184
+ end
185
+ ex.value = tv1 | tv2
186
+ $log.info "rule , #{ex.value}"
187
+ end
188
+
189
+ rule 'expression : expression ";"'do |ex, e1, op|
190
+ if e1.value.class == Hash
191
+ ex.value = e1.value
192
+ else
193
+ ex.value = e1.value
194
+ end
195
+ $log.info "rule expression ; #{ex.value}"
196
+ end
197
+
198
+ rule 'expression : expression ";" expression' do |ex, e1, op, e2|
199
+ ex.value = e1.value
200
+ begin
201
+ self.stack.merge!(e2.value)
202
+ rescue
203
+ if e2.value.class == Array
204
+ mh = { e2.value[0].to_s + "," + e2.value[1].keys()[0].to_s => e2.value[1].values()[0] }
205
+ self.stack.merge!(mh)
206
+ elsif e2.value.class == Integer or e2.value.class == String
207
+ mh = {e2.value => ""}
208
+ self.stack.merge!(mh)
209
+ else
210
+ raise "sematic error #{e1.value} ; #{e2.value}"
211
+ end
212
+ end
213
+ $log.info "rule expression e ; e #{ex.value}"
214
+ end
215
+
216
+ rule 'expression : HEX expression' do |ex, h, e|
217
+ ex.value = h.value.to_s + " " + e.value.to_s
218
+ $log.info "rule HEX expression #{ex.value}"
219
+ end
220
+
221
+ rule 'expression : expression COMMENTS ' do |ex, e, _|
222
+ ex.value = e.value
223
+ $log.info "rule e COMMENTS #{ex.value}"
224
+ end
225
+
226
+ rule 'expression : COMMENTS expression' do |ex, _, e|
227
+ ex.value = e.value
228
+ $log.info "rule e COMMENTS #{ex.value}"
229
+ end
230
+
231
+ rule 'expression : COMMENTS ' do |ex, _|
232
+ ex.value = ""
233
+ $log.info "rule COMMENTS #{ex.value}"
234
+ end
235
+
236
+ rule 'expression : CELLDATA' do |ex, n|
237
+ ex.value = n.value
238
+ $log.info "rule CELLDFATA #{ex.value}"
239
+ end
240
+
241
+ rule 'expression : BINARYDATA' do |ex, n|
242
+ ex.value = n.value
243
+ $log.info "rule BINARYDATA #{ex.value}"
244
+ end
245
+
246
+ rule 'expression : SINGLESTRING ' do |ex, n|
247
+ ex.value = n.value
248
+ $log.info "rule SINGLESTRING #{ex.value}"
249
+ end
250
+
251
+ rule 'expression : NUMBER' do |ex, n|
252
+ ex.value = n.value
253
+ $log.info "rule NUMBER #{ex.value}"
254
+ end
255
+
256
+ rule 'expression : DATA' do |ex, n|
257
+ ex.value = n.value
258
+ $log.info "rule DATA #{ex.value}"
259
+ end
260
+
261
+ rule 'expression : BITS ' do |ex, n|
262
+ ex.value = n.value
263
+ $log.info "rule BITS #{ex.value}"
264
+ end
265
+
266
+ rule 'expression : REFERENCE ' do |ex, n|
267
+ ex.value = n.value.gsub("&", "")
268
+ $log.info "rule REFERENCE #{ex.value}"
269
+ end
270
+
271
+ #store_grammar 'grammar.txt'
272
+
273
+ end
274
+
275
+ def pre_process(in_string)
276
+ ps1 = in_string.gsub(/\/\/.+$/, "").split("\n").join().gsub(/\s+/, "\s").gsub(/\s=\s/, '=')
277
+ end
278
+
279
+
280
+ def dtb_parse_string(in_string)
281
+ parse_string = pre_process(in_string)
282
+ parser = DTBParse.new(DTBLex.new)
283
+ return parser.parse(parse_string)
284
+ end
285
+
286
+ def dtb_parse_file(file_path)
287
+ begin
288
+ file = File.open(file_path)
289
+ rescue
290
+ puts "#{file_path} open error"
291
+ end
292
+ return dtb_parse_string(file.read)
293
+ end
294
+
295
+ if __FILE__ == $0
296
+ $log.level = Logger::INFO
297
+ =begin
298
+ test_string = '''
299
+ /dts-v1/;
300
+
301
+ / {
302
+ node1 {
303
+ a-string-property = "A string";
304
+ a-string-list-property = "first string", "second string";
305
+ // hex is implied in byte arrays. no \'0x\' prefix is required
306
+ a-byte-data-property = [01 0x23 34 56];
307
+ child-node1 {
308
+ first-child-property;
309
+ second-child-property = <1>;
310
+ a-string-property = "Hello, world";
311
+ };
312
+ child-node2 {
313
+ };
314
+ };
315
+ node2 {
316
+ a-cell-property = <1 2 3 4>; /* each number (cell) is a uint32 */
317
+ an-empty-property;
318
+ child-node1 {
319
+ };
320
+ };
321
+ };
322
+ '''
323
+ lex = DTBLex.new(test_string)
324
+ lex.show()
325
+ ap dtb_parse_string(test_string)
326
+ =end
327
+ #ap dtb_parse_file("../test/sample.dts_compiled")
328
+
329
+ ap dtb_parse_file("../test/frdm_kw41z.dts_compiled")
330
+ end
metadata ADDED
@@ -0,0 +1,85 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rbdtb
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Hake Huang
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2019-11-20 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: awesome_print
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 1.8.0
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 1.8.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: rly
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 0.2.3
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 0.2.3
41
+ - !ruby/object:Gem::Dependency
42
+ name: logger
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '='
46
+ - !ruby/object:Gem::Version
47
+ version: 1.3.0
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '='
53
+ - !ruby/object:Gem::Version
54
+ version: 1.3.0
55
+ description: ruby plain device tree parser
56
+ email: hakehuang@gmail.com
57
+ executables: []
58
+ extensions: []
59
+ extra_rdoc_files: []
60
+ files:
61
+ - lib/rbdtb.rb
62
+ homepage: http://rubygems.org/gems/rbdtb
63
+ licenses:
64
+ - Apache-2.0
65
+ metadata: {}
66
+ post_install_message:
67
+ rdoc_options: []
68
+ require_paths:
69
+ - lib
70
+ required_ruby_version: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: '0'
75
+ required_rubygems_version: !ruby/object:Gem::Requirement
76
+ requirements:
77
+ - - ">="
78
+ - !ruby/object:Gem::Version
79
+ version: '0'
80
+ requirements: []
81
+ rubygems_version: 3.0.3
82
+ signing_key:
83
+ specification_version: 4
84
+ summary: rbdtb
85
+ test_files: []