hcl-checker 1.4.0 → 1.6.1
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.
- checksums.yaml +4 -4
- data/.rubocop.yml +32 -0
- data/Gemfile +3 -4
- data/Gemfile.lock +21 -22
- data/README.md +3 -3
- data/Rakefile +7 -8
- data/assets/lexer.rex +24 -19
- data/assets/parse.y +33 -14
- data/bin/console +3 -3
- data/hcl-checker.gemspec +9 -25
- data/lib/hcl/{lexer.rb → checker/lexer.rb} +23 -16
- data/lib/hcl/checker/parser.rb +496 -0
- data/lib/hcl/checker/version.rb +1 -1
- data/lib/hcl/checker.rb +27 -14
- metadata +34 -54
- data/lib/hcl/parser.rb +0 -456
- data/lib/hcl1/checker/version.rb +0 -5
- data/lib/hcl1/checker.rb +0 -21
- data/lib/hcl1/lexer.rb +0 -175
- data/lib/hcl1/parser.rb +0 -456
@@ -0,0 +1,496 @@
|
|
1
|
+
#
|
2
|
+
# DO NOT MODIFY!!!!
|
3
|
+
# This file is automatically generated by Racc 1.5.2
|
4
|
+
# from Racc grammar file "".
|
5
|
+
#
|
6
|
+
|
7
|
+
require 'racc/parser.rb'
|
8
|
+
|
9
|
+
require_relative 'lexer'
|
10
|
+
|
11
|
+
module HCL
|
12
|
+
module Checker
|
13
|
+
class Parser < Racc::Parser
|
14
|
+
|
15
|
+
module_eval(<<'...end parse.y/module_eval...', 'parse.y', 128)
|
16
|
+
#//
|
17
|
+
#// HCL is unclear on what one should do when duplicate
|
18
|
+
#// keys are encountered.
|
19
|
+
#//
|
20
|
+
#// from decoder.go: if we're at the root or we're directly within
|
21
|
+
#// a list, decode to hashes, otherwise lists
|
22
|
+
#//
|
23
|
+
#// from object.go: there is a flattened list structure
|
24
|
+
#//
|
25
|
+
#// if @duplicate_mode is set:
|
26
|
+
#// - :array then duplicates will be appended to an array
|
27
|
+
#// - :merge then duplicates will be deep merged into a hash
|
28
|
+
#//
|
29
|
+
def flatten_objectlist(list)
|
30
|
+
(list || {}).each_with_object({}) do |a, h|
|
31
|
+
if h.keys.include?(a.first)
|
32
|
+
case @duplicate_mode
|
33
|
+
when :array
|
34
|
+
if h[a.first].is_a?(Array)
|
35
|
+
h[a.first].push(a.last)
|
36
|
+
else
|
37
|
+
h[a.first] = [ h[a.first], a.last ]
|
38
|
+
end
|
39
|
+
when :merge
|
40
|
+
deep_merge(h[a.first] || {}, a.last)
|
41
|
+
else raise ArgumentError
|
42
|
+
end
|
43
|
+
else
|
44
|
+
h[a.first] = a.last
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
|
50
|
+
def on_error(error_token_id, error_value, value_stack)
|
51
|
+
error_message = value_stack.to_s.split(',').last.gsub(']', '')
|
52
|
+
header = "Parse error at #{error_message} #{error_value} (invalid token: #{error_value})"
|
53
|
+
raise Racc::ParseError, header
|
54
|
+
end
|
55
|
+
|
56
|
+
|
57
|
+
def parse(input, duplicate_mode = :array)
|
58
|
+
@duplicate_mode = duplicate_mode
|
59
|
+
@lexer = HCL::Checker::Lexer.new.lex(input)
|
60
|
+
do_parse
|
61
|
+
|
62
|
+
@result
|
63
|
+
end
|
64
|
+
|
65
|
+
|
66
|
+
def next_token
|
67
|
+
@lexer.shift
|
68
|
+
end
|
69
|
+
|
70
|
+
def deep_merge(hash1, hash2)
|
71
|
+
hash2.keys.each do |key|
|
72
|
+
value1 = hash1[key]
|
73
|
+
value2 = hash2[key]
|
74
|
+
|
75
|
+
if value1.is_a?(Hash) && value2.is_a?(Hash)
|
76
|
+
hash1[key] = deep_merge(value1, value2)
|
77
|
+
else
|
78
|
+
hash1[key] = value2
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
hash1
|
83
|
+
end
|
84
|
+
...end parse.y/module_eval...
|
85
|
+
##### State transition tables begin ###
|
86
|
+
|
87
|
+
racc_action_table = [
|
88
|
+
22, 29, 28, 10, 19, 26, 43, 23, 5, 14,
|
89
|
+
6, 27, 29, 28, 5, 42, 6, 13, 37, 40,
|
90
|
+
14, 32, 27, 34, 29, 28, 5, 5, 6, 6,
|
91
|
+
37, 31, 14, 17, 27, 18, -11, 14, -10, 41,
|
92
|
+
12, 44, 20 ]
|
93
|
+
|
94
|
+
racc_action_check = [
|
95
|
+
13, 13, 13, 1, 10, 13, 33, 13, 0, 13,
|
96
|
+
0, 13, 27, 27, 30, 33, 30, 7, 27, 30,
|
97
|
+
27, 26, 27, 27, 43, 43, 14, 3, 14, 3,
|
98
|
+
43, 14, 43, 9, 43, 9, 6, 9, 5, 32,
|
99
|
+
4, 41, 11 ]
|
100
|
+
|
101
|
+
racc_action_pointer = [
|
102
|
+
1, 3, nil, 20, 35, 30, 28, 9, nil, 26,
|
103
|
+
4, 37, nil, -2, 19, nil, nil, nil, nil, nil,
|
104
|
+
nil, nil, nil, nil, nil, nil, 6, 9, nil, nil,
|
105
|
+
7, nil, 32, 1, nil, nil, nil, nil, nil, nil,
|
106
|
+
nil, 25, nil, 21, nil, nil ]
|
107
|
+
|
108
|
+
racc_action_default = [
|
109
|
+
-2, -35, -1, -3, -5, -22, -23, -35, -19, -35,
|
110
|
+
-35, -7, -4, -35, -35, -20, -21, -22, -23, 46,
|
111
|
+
-6, -12, -13, -14, -15, -16, -18, -35, -33, -34,
|
112
|
+
-35, -9, -35, -35, -25, -26, -29, -30, -31, -32,
|
113
|
+
-8, -35, -24, -28, -17, -27 ]
|
114
|
+
|
115
|
+
racc_goto_table = [
|
116
|
+
11, 35, 3, 15, 16, 33, 21, 24, 2, 1,
|
117
|
+
25, nil, nil, nil, nil, nil, 30, 45, nil, nil,
|
118
|
+
nil, nil, nil, nil, nil, nil, nil, 11 ]
|
119
|
+
|
120
|
+
racc_goto_check = [
|
121
|
+
4, 12, 3, 5, 9, 11, 7, 5, 2, 1,
|
122
|
+
8, nil, nil, nil, nil, nil, 3, 12, nil, nil,
|
123
|
+
nil, nil, nil, nil, nil, nil, nil, 4 ]
|
124
|
+
|
125
|
+
racc_goto_pointer = [
|
126
|
+
nil, 9, 8, 2, -3, -6, nil, -7, -3, -5,
|
127
|
+
nil, -22, -26 ]
|
128
|
+
|
129
|
+
racc_goto_default = [
|
130
|
+
nil, nil, nil, nil, 4, 39, 7, 36, 38, 8,
|
131
|
+
9, nil, nil ]
|
132
|
+
|
133
|
+
racc_reduce_table = [
|
134
|
+
0, 0, :racc_error,
|
135
|
+
1, 21, :_reduce_1,
|
136
|
+
0, 22, :_reduce_2,
|
137
|
+
1, 22, :_reduce_none,
|
138
|
+
2, 23, :_reduce_4,
|
139
|
+
1, 23, :_reduce_5,
|
140
|
+
3, 23, :_reduce_6,
|
141
|
+
2, 23, :_reduce_7,
|
142
|
+
3, 25, :_reduce_8,
|
143
|
+
2, 25, :_reduce_9,
|
144
|
+
1, 26, :_reduce_10,
|
145
|
+
1, 26, :_reduce_11,
|
146
|
+
3, 24, :_reduce_12,
|
147
|
+
3, 24, :_reduce_13,
|
148
|
+
3, 24, :_reduce_14,
|
149
|
+
3, 24, :_reduce_15,
|
150
|
+
3, 24, :_reduce_16,
|
151
|
+
6, 24, :_reduce_17,
|
152
|
+
3, 24, :_reduce_18,
|
153
|
+
1, 24, :_reduce_19,
|
154
|
+
2, 29, :_reduce_20,
|
155
|
+
2, 29, :_reduce_21,
|
156
|
+
1, 30, :_reduce_22,
|
157
|
+
1, 30, :_reduce_23,
|
158
|
+
3, 28, :_reduce_24,
|
159
|
+
2, 28, :_reduce_25,
|
160
|
+
1, 31, :_reduce_26,
|
161
|
+
3, 31, :_reduce_27,
|
162
|
+
2, 31, :_reduce_28,
|
163
|
+
1, 32, :_reduce_29,
|
164
|
+
1, 32, :_reduce_30,
|
165
|
+
1, 32, :_reduce_31,
|
166
|
+
1, 32, :_reduce_32,
|
167
|
+
1, 27, :_reduce_33,
|
168
|
+
1, 27, :_reduce_34 ]
|
169
|
+
|
170
|
+
racc_reduce_n = 35
|
171
|
+
|
172
|
+
racc_shift_n = 46
|
173
|
+
|
174
|
+
racc_token_table = {
|
175
|
+
false => 0,
|
176
|
+
:error => 1,
|
177
|
+
:BOOL => 2,
|
178
|
+
:FLOAT => 3,
|
179
|
+
:NUMBER => 4,
|
180
|
+
:COMMA => 5,
|
181
|
+
:COMMAEND => 6,
|
182
|
+
:IDENTIFIER => 7,
|
183
|
+
:EQUAL => 8,
|
184
|
+
:STRING => 9,
|
185
|
+
:MINUS => 10,
|
186
|
+
:LEFTBRACE => 11,
|
187
|
+
:RIGHTBRACE => 12,
|
188
|
+
:LEFTBRACKET => 13,
|
189
|
+
:RIGHTBRACKET => 14,
|
190
|
+
:LEFTPARENTHESES => 15,
|
191
|
+
:RIGHTPARENTHESES => 16,
|
192
|
+
:PERIOD => 17,
|
193
|
+
:EPLUS => 18,
|
194
|
+
:EMINUS => 19 }
|
195
|
+
|
196
|
+
racc_nt_base = 20
|
197
|
+
|
198
|
+
racc_use_result_var = true
|
199
|
+
|
200
|
+
Racc_arg = [
|
201
|
+
racc_action_table,
|
202
|
+
racc_action_check,
|
203
|
+
racc_action_default,
|
204
|
+
racc_action_pointer,
|
205
|
+
racc_goto_table,
|
206
|
+
racc_goto_check,
|
207
|
+
racc_goto_default,
|
208
|
+
racc_goto_pointer,
|
209
|
+
racc_nt_base,
|
210
|
+
racc_reduce_table,
|
211
|
+
racc_token_table,
|
212
|
+
racc_shift_n,
|
213
|
+
racc_reduce_n,
|
214
|
+
racc_use_result_var ]
|
215
|
+
|
216
|
+
Racc_token_to_s_table = [
|
217
|
+
"$end",
|
218
|
+
"error",
|
219
|
+
"BOOL",
|
220
|
+
"FLOAT",
|
221
|
+
"NUMBER",
|
222
|
+
"COMMA",
|
223
|
+
"COMMAEND",
|
224
|
+
"IDENTIFIER",
|
225
|
+
"EQUAL",
|
226
|
+
"STRING",
|
227
|
+
"MINUS",
|
228
|
+
"LEFTBRACE",
|
229
|
+
"RIGHTBRACE",
|
230
|
+
"LEFTBRACKET",
|
231
|
+
"RIGHTBRACKET",
|
232
|
+
"LEFTPARENTHESES",
|
233
|
+
"RIGHTPARENTHESES",
|
234
|
+
"PERIOD",
|
235
|
+
"EPLUS",
|
236
|
+
"EMINUS",
|
237
|
+
"$start",
|
238
|
+
"target",
|
239
|
+
"top",
|
240
|
+
"objectlist",
|
241
|
+
"objectitem",
|
242
|
+
"object",
|
243
|
+
"objectkey",
|
244
|
+
"number",
|
245
|
+
"list",
|
246
|
+
"block",
|
247
|
+
"block_id",
|
248
|
+
"listitems",
|
249
|
+
"listitem" ]
|
250
|
+
|
251
|
+
Racc_debug_parser = false
|
252
|
+
|
253
|
+
##### State transition tables end #####
|
254
|
+
|
255
|
+
# reduce 0 omitted
|
256
|
+
|
257
|
+
module_eval(<<'.,.,', 'parse.y', 21)
|
258
|
+
def _reduce_1(val, _values, result)
|
259
|
+
@result = flatten_objectlist(val[0])
|
260
|
+
result
|
261
|
+
end
|
262
|
+
.,.,
|
263
|
+
|
264
|
+
module_eval(<<'.,.,', 'parse.y', 24)
|
265
|
+
def _reduce_2(val, _values, result)
|
266
|
+
result = val[0]
|
267
|
+
result
|
268
|
+
end
|
269
|
+
.,.,
|
270
|
+
|
271
|
+
# reduce 3 omitted
|
272
|
+
|
273
|
+
module_eval(<<'.,.,', 'parse.y', 30)
|
274
|
+
def _reduce_4(val, _values, result)
|
275
|
+
result = [val[0]]
|
276
|
+
result
|
277
|
+
end
|
278
|
+
.,.,
|
279
|
+
|
280
|
+
module_eval(<<'.,.,', 'parse.y', 32)
|
281
|
+
def _reduce_5(val, _values, result)
|
282
|
+
result = [val[0]]
|
283
|
+
result
|
284
|
+
end
|
285
|
+
.,.,
|
286
|
+
|
287
|
+
module_eval(<<'.,.,', 'parse.y', 34)
|
288
|
+
def _reduce_6(val, _values, result)
|
289
|
+
result = val[0] << val[1]
|
290
|
+
result
|
291
|
+
end
|
292
|
+
.,.,
|
293
|
+
|
294
|
+
module_eval(<<'.,.,', 'parse.y', 36)
|
295
|
+
def _reduce_7(val, _values, result)
|
296
|
+
result = val[0] << val[1]
|
297
|
+
result
|
298
|
+
end
|
299
|
+
.,.,
|
300
|
+
|
301
|
+
module_eval(<<'.,.,', 'parse.y', 41)
|
302
|
+
def _reduce_8(val, _values, result)
|
303
|
+
result = flatten_objectlist(val[1])
|
304
|
+
result
|
305
|
+
end
|
306
|
+
.,.,
|
307
|
+
|
308
|
+
module_eval(<<'.,.,', 'parse.y', 43)
|
309
|
+
def _reduce_9(val, _values, result)
|
310
|
+
return {}
|
311
|
+
result
|
312
|
+
end
|
313
|
+
.,.,
|
314
|
+
|
315
|
+
module_eval(<<'.,.,', 'parse.y', 48)
|
316
|
+
def _reduce_10(val, _values, result)
|
317
|
+
result = val[0]
|
318
|
+
result
|
319
|
+
end
|
320
|
+
.,.,
|
321
|
+
|
322
|
+
module_eval(<<'.,.,', 'parse.y', 50)
|
323
|
+
def _reduce_11(val, _values, result)
|
324
|
+
result = val[0]
|
325
|
+
result
|
326
|
+
end
|
327
|
+
.,.,
|
328
|
+
|
329
|
+
module_eval(<<'.,.,', 'parse.y', 55)
|
330
|
+
def _reduce_12(val, _values, result)
|
331
|
+
result = val[0], val[2]
|
332
|
+
result
|
333
|
+
end
|
334
|
+
.,.,
|
335
|
+
|
336
|
+
module_eval(<<'.,.,', 'parse.y', 57)
|
337
|
+
def _reduce_13(val, _values, result)
|
338
|
+
result = val[0], val[2]
|
339
|
+
result
|
340
|
+
end
|
341
|
+
.,.,
|
342
|
+
|
343
|
+
module_eval(<<'.,.,', 'parse.y', 59)
|
344
|
+
def _reduce_14(val, _values, result)
|
345
|
+
result = val[0], val[2]
|
346
|
+
result
|
347
|
+
end
|
348
|
+
.,.,
|
349
|
+
|
350
|
+
module_eval(<<'.,.,', 'parse.y', 61)
|
351
|
+
def _reduce_15(val, _values, result)
|
352
|
+
result = val[0], val[2]
|
353
|
+
result
|
354
|
+
end
|
355
|
+
.,.,
|
356
|
+
|
357
|
+
module_eval(<<'.,.,', 'parse.y', 63)
|
358
|
+
def _reduce_16(val, _values, result)
|
359
|
+
result = val[0], val[2]
|
360
|
+
result
|
361
|
+
end
|
362
|
+
.,.,
|
363
|
+
|
364
|
+
module_eval(<<'.,.,', 'parse.y', 65)
|
365
|
+
def _reduce_17(val, _values, result)
|
366
|
+
result = val[0], "#{val[2]}(#{val[4]})"
|
367
|
+
result
|
368
|
+
end
|
369
|
+
.,.,
|
370
|
+
|
371
|
+
module_eval(<<'.,.,', 'parse.y', 67)
|
372
|
+
def _reduce_18(val, _values, result)
|
373
|
+
result = val[0], val[2]
|
374
|
+
result
|
375
|
+
end
|
376
|
+
.,.,
|
377
|
+
|
378
|
+
module_eval(<<'.,.,', 'parse.y', 69)
|
379
|
+
def _reduce_19(val, _values, result)
|
380
|
+
result = val[0]
|
381
|
+
result
|
382
|
+
end
|
383
|
+
.,.,
|
384
|
+
|
385
|
+
module_eval(<<'.,.,', 'parse.y', 74)
|
386
|
+
def _reduce_20(val, _values, result)
|
387
|
+
result = val[0], val[1]
|
388
|
+
result
|
389
|
+
end
|
390
|
+
.,.,
|
391
|
+
|
392
|
+
module_eval(<<'.,.,', 'parse.y', 76)
|
393
|
+
def _reduce_21(val, _values, result)
|
394
|
+
result = val[0], {val[1][0] => val[1][1]}
|
395
|
+
result
|
396
|
+
end
|
397
|
+
.,.,
|
398
|
+
|
399
|
+
module_eval(<<'.,.,', 'parse.y', 81)
|
400
|
+
def _reduce_22(val, _values, result)
|
401
|
+
result = val[0]
|
402
|
+
result
|
403
|
+
end
|
404
|
+
.,.,
|
405
|
+
|
406
|
+
module_eval(<<'.,.,', 'parse.y', 83)
|
407
|
+
def _reduce_23(val, _values, result)
|
408
|
+
result = val[0]
|
409
|
+
result
|
410
|
+
end
|
411
|
+
.,.,
|
412
|
+
|
413
|
+
module_eval(<<'.,.,', 'parse.y', 88)
|
414
|
+
def _reduce_24(val, _values, result)
|
415
|
+
result = val[1]
|
416
|
+
result
|
417
|
+
end
|
418
|
+
.,.,
|
419
|
+
|
420
|
+
module_eval(<<'.,.,', 'parse.y', 90)
|
421
|
+
def _reduce_25(val, _values, result)
|
422
|
+
return []
|
423
|
+
result
|
424
|
+
end
|
425
|
+
.,.,
|
426
|
+
|
427
|
+
module_eval(<<'.,.,', 'parse.y', 95)
|
428
|
+
def _reduce_26(val, _values, result)
|
429
|
+
result = [val[0]]
|
430
|
+
result
|
431
|
+
end
|
432
|
+
.,.,
|
433
|
+
|
434
|
+
module_eval(<<'.,.,', 'parse.y', 97)
|
435
|
+
def _reduce_27(val, _values, result)
|
436
|
+
result = val[0] << val[2]
|
437
|
+
result
|
438
|
+
end
|
439
|
+
.,.,
|
440
|
+
|
441
|
+
module_eval(<<'.,.,', 'parse.y', 99)
|
442
|
+
def _reduce_28(val, _values, result)
|
443
|
+
result = val[0]
|
444
|
+
result
|
445
|
+
end
|
446
|
+
.,.,
|
447
|
+
|
448
|
+
module_eval(<<'.,.,', 'parse.y', 104)
|
449
|
+
def _reduce_29(val, _values, result)
|
450
|
+
result = val[0]
|
451
|
+
result
|
452
|
+
end
|
453
|
+
.,.,
|
454
|
+
|
455
|
+
module_eval(<<'.,.,', 'parse.y', 106)
|
456
|
+
def _reduce_30(val, _values, result)
|
457
|
+
result = val[0]
|
458
|
+
result
|
459
|
+
end
|
460
|
+
.,.,
|
461
|
+
|
462
|
+
module_eval(<<'.,.,', 'parse.y', 108)
|
463
|
+
def _reduce_31(val, _values, result)
|
464
|
+
result = val[0]
|
465
|
+
result
|
466
|
+
end
|
467
|
+
.,.,
|
468
|
+
|
469
|
+
module_eval(<<'.,.,', 'parse.y', 110)
|
470
|
+
def _reduce_32(val, _values, result)
|
471
|
+
result = val[0]
|
472
|
+
result
|
473
|
+
end
|
474
|
+
.,.,
|
475
|
+
|
476
|
+
module_eval(<<'.,.,', 'parse.y', 115)
|
477
|
+
def _reduce_33(val, _values, result)
|
478
|
+
result = val[0]
|
479
|
+
result
|
480
|
+
end
|
481
|
+
.,.,
|
482
|
+
|
483
|
+
module_eval(<<'.,.,', 'parse.y', 117)
|
484
|
+
def _reduce_34(val, _values, result)
|
485
|
+
result = val[0]
|
486
|
+
result
|
487
|
+
end
|
488
|
+
.,.,
|
489
|
+
|
490
|
+
def _reduce_none(val, _values, result)
|
491
|
+
val[0]
|
492
|
+
end
|
493
|
+
|
494
|
+
end # class Parser
|
495
|
+
end # module Checker
|
496
|
+
end # module HCL
|
data/lib/hcl/checker/version.rb
CHANGED
data/lib/hcl/checker.rb
CHANGED
@@ -1,21 +1,34 @@
|
|
1
|
-
|
2
|
-
require_relative 'lexer'
|
3
|
-
require_relative 'parser'
|
1
|
+
require_relative 'checker/version'
|
2
|
+
require_relative 'checker/lexer'
|
3
|
+
require_relative 'checker/parser'
|
4
4
|
|
5
5
|
module HCL
|
6
6
|
module Checker
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
7
|
+
VALID_DUPLICATE_MODES = %i(array merge).freeze
|
8
|
+
|
9
|
+
class << self
|
10
|
+
attr_accessor :last_error
|
11
|
+
|
12
|
+
def valid?(value)
|
13
|
+
ret = HCL::Checker::Parser.new.parse(value)
|
14
|
+
return true if ret.is_a? Hash
|
15
|
+
|
16
|
+
false
|
17
|
+
rescue Racc::ParseError => e
|
18
|
+
@last_error = e.message
|
19
|
+
|
20
|
+
false
|
21
|
+
end
|
22
|
+
|
23
|
+
def parse(value, duplicate_mode = :array)
|
24
|
+
raise ArgumentError, "Invalid duplicate mode #{duplicate_mode}, must be one of #{VALID_DUPLICATE_MODES}" unless VALID_DUPLICATE_MODES.include?(duplicate_mode)
|
25
|
+
|
26
|
+
HCL::Checker::Parser.new.parse(value, duplicate_mode)
|
27
|
+
rescue Racc::ParseError => e
|
28
|
+
@last_error = e.message
|
14
29
|
|
15
|
-
|
16
|
-
|
17
|
-
rescue Racc::ParseError => e
|
18
|
-
return e.message
|
30
|
+
e.message
|
31
|
+
end
|
19
32
|
end
|
20
33
|
end
|
21
34
|
end
|