rbdtb 1.0.0

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