tla2dot 0.0.3

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.
@@ -0,0 +1,712 @@
1
+ #
2
+ # DO NOT MODIFY!!!!
3
+ # This file is automatically generated by Racc 1.4.12
4
+ # from Racc grammer file "".
5
+ #
6
+
7
+ require 'racc/parser.rb'
8
+ class Tla2DotParser < Racc::Parser
9
+
10
+ module_eval(<<'...end parser.y/module_eval...', 'parser.y', 89)
11
+
12
+ class Node
13
+
14
+ include TLA2DOT::Utils::MyLogger # mix logger
15
+
16
+ @@logger = nil; # common logger for all nodes
17
+ @@options = {}; # common logger for all nodes
18
+
19
+
20
+ # ------------------------------------------------------------------
21
+ # Attributes
22
+
23
+ # instance
24
+ attr_accessor :name #
25
+ attr_accessor :variables # hash of name=>
26
+ attr_accessor :edges # list of nodes reachable
27
+
28
+ # ------------------------------------------------------------------
29
+ # constructore
30
+ def initialize( name, variables )
31
+ @name = name
32
+ @variables = variables
33
+ @edges = []
34
+ @filter_render_variables = []
35
+ end
36
+
37
+ def myLogger
38
+ return @@logger if @@logger
39
+ @@logger = getLogger( "Node", getOptions )
40
+ @@logger.info( "#{__method__} created" )
41
+ @@logger
42
+ end
43
+
44
+ def setOptions( options )
45
+ @@options = options
46
+ end
47
+
48
+ def getOptions
49
+ @@options
50
+ end
51
+
52
+ def name
53
+ @name
54
+ end
55
+
56
+ def variables=( variables )
57
+ @variables = variables
58
+ end
59
+
60
+ def variables
61
+ @variables
62
+ end
63
+
64
+ def ==( node )
65
+ node.respond_to?( :name) && self.name == node.name
66
+ end
67
+
68
+ def add_edge( node )
69
+ @edges << node unless @edges.include?( node )
70
+ end
71
+
72
+ def successor_cnt
73
+ @edges.size
74
+ end
75
+
76
+ # array of successors for the node
77
+ def successors
78
+ @edges
79
+ end
80
+
81
+ # array tranitions (from_state->to_state) from this node to another
82
+ def transitions
83
+ myLogger.debug( "#{__method__} starting" )
84
+ successors.select{ |n| n.name != name }.map{ |n| { :to_state => n.name, :from_state => self.name } }
85
+ end
86
+
87
+ # array of variable names to render
88
+ def filter_render_variables
89
+ myLogger.debug( "#{__method__} filter_render_variables=#{@filter_render_variables} #{@filter_render_variables.class}" )
90
+ @filter_render_variables
91
+ end
92
+
93
+ # called when added to graph
94
+ def filter_render_variables=( variables )
95
+
96
+ @filter_render_variables = variables
97
+ end
98
+
99
+ # return true is state should show variable
100
+ def include_variable( variable )
101
+
102
+ return filter_render_variables.include?( variable ) if
103
+ filter_render_variables.kind_of?( Array )
104
+
105
+ # assume boolean
106
+ return filter_render_variables
107
+
108
+ end
109
+
110
+
111
+ # node variable to render as key/state hash (including 'id')
112
+ def content
113
+ myLogger.debug( "#{__method__} starting" )
114
+ vars = variables;
115
+ vars['ID'] = name
116
+ vars.select{ |k,v| include_variable( k ) }.
117
+ map { |k,v|
118
+ {:key =>k, :val => v, :state => render_value(v) }
119
+ }
120
+
121
+ end
122
+
123
+ # escape for mustache rendering
124
+ def render_value( v )
125
+ return v.to_s.
126
+ gsub( /\{/, "\\{" ).
127
+ gsub( /\}/, "\\}" ).
128
+ gsub( /=>/, "=" ).
129
+ # gsub( /\{/, "" ).
130
+ # gsub( /\}/, "" ).
131
+ # gsub( /\[/, "" ).
132
+ # gsub( /\]/, "" ).
133
+ # gsub( /\[/, "\\[" ).
134
+ # gsub( /\]/, "\\]" ).
135
+ gsub( /"/, '\\"' )
136
+ # case
137
+ # when v.kind_of?( Hash )
138
+ # return v.to_s.gsub( /\{/, "\\{" ).gsub( /\}/, "\\}" )
139
+ # else
140
+ # return v
141
+ # end
142
+
143
+ end
144
+
145
+
146
+ end
147
+
148
+
149
+ class Graph
150
+
151
+ include TLA2DOT::Utils::MyLogger # mix logger
152
+
153
+
154
+ attr_reader :nodes #
155
+
156
+ def initialize( filter_render_variables, options )
157
+ @nodes = {}
158
+ # filter_render_variables passed to node
159
+ @filter_render_variables = filter_render_variables
160
+ setOptions( options )
161
+ end
162
+
163
+ def myLogger
164
+ return @logger if @logger
165
+ @logger = getLogger( "Graph", getOptions )
166
+ @logger.info( "#{__method__} created" )
167
+ @logger
168
+ end
169
+
170
+
171
+ def setOptions( options )
172
+ @options = options
173
+ end
174
+
175
+ def getOptions
176
+ @options
177
+ end
178
+
179
+ def add_node(node)
180
+ node.filter_render_variables=( @filter_render_variables )
181
+ node.setOptions( getOptions )
182
+ myLogger.debug( "#{__method__} added node #{node}, @filter_render_variables=#{@filter_render_variables} #{@filter_render_variables.class}" )
183
+ @nodes[node.name] = node
184
+ self
185
+ end
186
+
187
+
188
+ def nodes
189
+ @nodes
190
+ end
191
+
192
+ def states
193
+ @nodes.values
194
+ end
195
+
196
+
197
+ def node_cnt
198
+ @nodes.size
199
+ end
200
+
201
+
202
+ def add_edge(predecessor_name, successor_name)
203
+
204
+ predecessor_node = @nodes[predecessor_name]
205
+ raise "Unknown precessor node #{predecessor_name}" unless predecessor_node
206
+ successor_node = @nodes[successor_name]
207
+ raise "Unknown precessor node #{successor_name}" unless successor_node
208
+ @nodes[predecessor_name].add_edge(@nodes[successor_name])
209
+ end
210
+
211
+ def [](name)
212
+ @nodes[name]
213
+ end
214
+ end
215
+
216
+ # ------------------------------------------------------------------
217
+
218
+ include TLA2DOT::Utils::MyLogger # mix logger
219
+ PROGNAME = "parser" # progname for logger
220
+
221
+ def initialize( options = {} )
222
+ @logger = getLogger( PROGNAME, options )
223
+ @logger.debug( "#{__method__} initialized" )
224
+ setOptions( options )
225
+ end
226
+
227
+ def setOptions( options )
228
+ @options = options
229
+ end
230
+
231
+ def getOptions
232
+ @options
233
+ end
234
+
235
+
236
+
237
+ # entry point
238
+ def parse(str, filter_render_variables = [] )
239
+ @logger.info( "#{__method__} parsing started" )
240
+ @graph = Graph.new( filter_render_variables, getOptions )
241
+ @line = 0
242
+ return @graph if str.nil? || str.empty?
243
+ @str = str.kind_of?( Array ) ? str : [ str ]
244
+ begin
245
+ ret = yyparse self, :scan
246
+ @logger.info( "#{__method__} parsing done" )
247
+ return ret
248
+ rescue Exception => e
249
+ puts "Error on line #{@line} near #{@current}"
250
+ @logger.error( "#{__method__} error #{e}" )
251
+ # puts e
252
+ return nil
253
+ end
254
+ end
255
+
256
+ private
257
+
258
+ # return next line for scanner
259
+ def next_str
260
+ @current = @str.any? ? @str.shift : nil
261
+ @line += 1
262
+ @current
263
+ end
264
+
265
+
266
+ # racc token scanner
267
+ def scan
268
+ while true
269
+ str = next_str
270
+ break if str.nil?
271
+ until str.empty?
272
+ case str
273
+ when /\A\s+/
274
+ str = $'
275
+ when /\AState (\d+):/
276
+ yield [ :STATE, $1 ]
277
+ str = $'
278
+ when /\AState (\d+)\/(-?\d+):/
279
+ # using fingerprint name
280
+ yield [ :STATE, $2 ]
281
+ str = $'
282
+ when /\AState (\d+):/
283
+ yield [ :STATE, $1 ]
284
+ str = $'
285
+ when /\ATransition ([0-9\-\+]+)/
286
+ yield [ :TRANS, $1 ]
287
+ str = $'
288
+ when /\A"([^"]*)"*/
289
+ yield [ :STRING, $1 ]
290
+ str = $'
291
+ when /\A[a-zA-Z]\w*/
292
+ yield [ :IDENT, $& ]
293
+ str = $'
294
+ when /\A-?\d+/
295
+ yield [ :INTEGER, $& ]
296
+ str = $'
297
+ when /\A\/\\/
298
+ yield [ :AND, $& ]
299
+ str = $'
300
+ when /\A\|->/
301
+ yield [ $&, $& ]
302
+ str = $'
303
+ # when /\A\n/
304
+ # puts "Nl"
305
+ # yield [ :NL, $& ]
306
+ # str = $'
307
+ when /\A\-->/
308
+ yield [ $&, $& ]
309
+ str = $'
310
+ when /\A=/
311
+ yield [ $&, $& ]
312
+ str = $'
313
+ else
314
+ c = str[0,1]
315
+ yield [ c, c ]
316
+ str = str[1..-1]
317
+ end
318
+ end # until
319
+ end # while
320
+ yield [ false, '$'] # is optional from Racc 1.3.7
321
+ end
322
+
323
+ ...end parser.y/module_eval...
324
+ ##### State transition tables begin ###
325
+
326
+ racc_action_table = [
327
+ 32, 22, 39, 58, 34, 51, 52, 41, 33, 38,
328
+ 50, 57, 40, 46, 32, 27, 39, 45, 34, 25,
329
+ 26, 6, 33, 38, 9, 32, 40, 39, 6, 34,
330
+ 62, 9, 63, 33, 38, 17, 32, 40, 39, 19,
331
+ 34, 18, 15, 12, 33, 38, 22, 32, 40, 39,
332
+ 53, 34, 28, 61, 22, 33, 38, 10, 32, 40,
333
+ 39, 65, 34, 15, nil, nil, 33, 38, 27, nil,
334
+ 40, 29, 25, 26 ]
335
+
336
+ racc_action_check = [
337
+ 40, 38, 40, 47, 40, 42, 44, 38, 40, 40,
338
+ 42, 47, 40, 40, 52, 17, 52, 39, 52, 17,
339
+ 17, 2, 52, 52, 2, 58, 52, 58, 0, 58,
340
+ 54, 0, 54, 58, 58, 8, 63, 58, 63, 12,
341
+ 63, 10, 7, 6, 63, 63, 51, 45, 63, 45,
342
+ 45, 45, 21, 53, 15, 45, 45, 1, 28, 45,
343
+ 28, 62, 28, 13, nil, nil, 28, 28, 23, nil,
344
+ 28, 23, 23, 23 ]
345
+
346
+ racc_action_pointer = [
347
+ 26, 57, 19, nil, nil, nil, 40, 32, 29, nil,
348
+ 41, nil, 35, 53, nil, 46, nil, 11, nil, nil,
349
+ nil, 41, nil, 64, nil, nil, nil, nil, 54, nil,
350
+ nil, nil, nil, nil, nil, nil, nil, nil, -7, 11,
351
+ -4, nil, -4, nil, -9, 43, nil, -6, nil, nil,
352
+ nil, 38, 10, 46, 23, nil, nil, nil, 21, nil,
353
+ nil, nil, 54, 32, nil, nil, nil ]
354
+
355
+ racc_action_default = [
356
+ -43, -43, -1, -2, -4, -5, -43, -8, -9, -11,
357
+ -43, -3, -43, -7, -18, -43, -10, -43, 67, -6,
358
+ -19, -43, -21, -43, -13, -15, -16, -17, -43, -12,
359
+ -14, -20, -22, -23, -24, -25, -26, -27, -43, -43,
360
+ -43, -28, -43, -30, -43, -43, -38, -43, -40, -42,
361
+ -29, -43, -43, -43, -43, -35, -37, -39, -43, -31,
362
+ -32, -33, -43, -43, -41, -34, -36 ]
363
+
364
+ racc_goto_table = [
365
+ 31, 55, 48, 43, 24, 14, 3, 21, 11, 23,
366
+ 30, 20, 16, 42, 13, 54, 59, 56, 2, 66,
367
+ 64, 47, 1, nil, 60, nil, nil, nil, nil, nil,
368
+ nil, nil, nil, nil, nil, 56 ]
369
+
370
+ racc_goto_check = [
371
+ 14, 21, 23, 19, 11, 12, 3, 13, 3, 10,
372
+ 11, 12, 9, 18, 7, 20, 19, 14, 2, 21,
373
+ 23, 22, 1, nil, 14, nil, nil, nil, nil, nil,
374
+ nil, nil, nil, nil, nil, 14 ]
375
+
376
+ racc_goto_pointer = [
377
+ nil, 22, 18, 6, nil, nil, nil, 7, nil, 4,
378
+ -8, -13, -2, -8, -28, nil, nil, nil, -25, -35,
379
+ -30, -44, -19, -38 ]
380
+
381
+ racc_goto_default = [
382
+ nil, nil, nil, nil, 4, 5, 7, nil, 8, nil,
383
+ nil, nil, nil, 44, 49, 35, 36, 37, nil, nil,
384
+ nil, nil, nil, nil ]
385
+
386
+ racc_reduce_table = [
387
+ 0, 0, :racc_error,
388
+ 1, 19, :_reduce_1,
389
+ 1, 20, :_reduce_none,
390
+ 2, 20, :_reduce_none,
391
+ 1, 21, :_reduce_4,
392
+ 1, 21, :_reduce_none,
393
+ 3, 23, :_reduce_6,
394
+ 2, 22, :_reduce_7,
395
+ 1, 22, :_reduce_none,
396
+ 1, 24, :_reduce_none,
397
+ 2, 24, :_reduce_none,
398
+ 1, 26, :_reduce_11,
399
+ 3, 27, :_reduce_none,
400
+ 1, 28, :_reduce_none,
401
+ 2, 28, :_reduce_none,
402
+ 1, 29, :_reduce_none,
403
+ 1, 29, :_reduce_none,
404
+ 1, 29, :_reduce_none,
405
+ 1, 25, :_reduce_none,
406
+ 2, 25, :_reduce_19,
407
+ 4, 30, :_reduce_20,
408
+ 1, 31, :_reduce_none,
409
+ 1, 32, :_reduce_22,
410
+ 1, 32, :_reduce_none,
411
+ 1, 32, :_reduce_none,
412
+ 1, 32, :_reduce_none,
413
+ 1, 32, :_reduce_none,
414
+ 1, 32, :_reduce_none,
415
+ 2, 33, :_reduce_28,
416
+ 3, 33, :_reduce_29,
417
+ 1, 36, :_reduce_30,
418
+ 3, 36, :_reduce_31,
419
+ 3, 37, :_reduce_32,
420
+ 4, 35, :_reduce_33,
421
+ 5, 35, :_reduce_34,
422
+ 1, 38, :_reduce_none,
423
+ 3, 38, :_reduce_36,
424
+ 1, 39, :_reduce_37,
425
+ 2, 34, :_reduce_38,
426
+ 3, 34, :_reduce_39,
427
+ 1, 40, :_reduce_none,
428
+ 3, 40, :_reduce_41,
429
+ 1, 41, :_reduce_42 ]
430
+
431
+ racc_reduce_n = 43
432
+
433
+ racc_shift_n = 67
434
+
435
+ racc_token_table = {
436
+ false => 0,
437
+ :error => 1,
438
+ :TRANS => 2,
439
+ "-->" => 3,
440
+ :INTEGER => 4,
441
+ :STATE => 5,
442
+ "<" => 6,
443
+ ">" => 7,
444
+ :IDENT => 8,
445
+ "," => 9,
446
+ :AND => 10,
447
+ "=" => 11,
448
+ :STRING => 12,
449
+ "[" => 13,
450
+ "]" => 14,
451
+ "|->" => 15,
452
+ "{" => 16,
453
+ "}" => 17 }
454
+
455
+ racc_nt_base = 18
456
+
457
+ racc_use_result_var = false
458
+
459
+ Racc_arg = [
460
+ racc_action_table,
461
+ racc_action_check,
462
+ racc_action_default,
463
+ racc_action_pointer,
464
+ racc_goto_table,
465
+ racc_goto_check,
466
+ racc_goto_default,
467
+ racc_goto_pointer,
468
+ racc_nt_base,
469
+ racc_reduce_table,
470
+ racc_token_table,
471
+ racc_shift_n,
472
+ racc_reduce_n,
473
+ racc_use_result_var ]
474
+
475
+ Racc_token_to_s_table = [
476
+ "$end",
477
+ "error",
478
+ "TRANS",
479
+ "\"-->\"",
480
+ "INTEGER",
481
+ "STATE",
482
+ "\"<\"",
483
+ "\">\"",
484
+ "IDENT",
485
+ "\",\"",
486
+ "AND",
487
+ "\"=\"",
488
+ "STRING",
489
+ "\"[\"",
490
+ "\"]\"",
491
+ "\"|->\"",
492
+ "\"{\"",
493
+ "\"}\"",
494
+ "$start",
495
+ "target",
496
+ "entries",
497
+ "entry",
498
+ "state",
499
+ "trans",
500
+ "state_def",
501
+ "variables",
502
+ "state_id",
503
+ "actiondef",
504
+ "actionspecs",
505
+ "actionspec",
506
+ "variable",
507
+ "name",
508
+ "value",
509
+ "record",
510
+ "set",
511
+ "seq",
512
+ "rlist",
513
+ "ritem",
514
+ "seqlist",
515
+ "seqitem",
516
+ "slist",
517
+ "sitem" ]
518
+
519
+ Racc_debug_parser = false
520
+
521
+ ##### State transition tables end #####
522
+
523
+ # reduce 0 omitted
524
+
525
+ module_eval(<<'.,.,', 'parser.y', 12)
526
+ def _reduce_1(val, _values)
527
+ @graph
528
+ end
529
+ .,.,
530
+
531
+ # reduce 2 omitted
532
+
533
+ # reduce 3 omitted
534
+
535
+ module_eval(<<'.,.,', 'parser.y', 17)
536
+ def _reduce_4(val, _values)
537
+ @graph.add_node( val[0] )
538
+ end
539
+ .,.,
540
+
541
+ # reduce 5 omitted
542
+
543
+ module_eval(<<'.,.,', 'parser.y', 21)
544
+ def _reduce_6(val, _values)
545
+ @graph.add_edge( val[0], val[2] )
546
+ end
547
+ .,.,
548
+
549
+ module_eval(<<'.,.,', 'parser.y', 27)
550
+ def _reduce_7(val, _values)
551
+ val[0].variables=val[1]; val[0]
552
+ end
553
+ .,.,
554
+
555
+ # reduce 8 omitted
556
+
557
+ # reduce 9 omitted
558
+
559
+ # reduce 10 omitted
560
+
561
+ module_eval(<<'.,.,', 'parser.y', 33)
562
+ def _reduce_11(val, _values)
563
+ Node.new( val[0], {} )
564
+ end
565
+ .,.,
566
+
567
+ # reduce 12 omitted
568
+
569
+ # reduce 13 omitted
570
+
571
+ # reduce 14 omitted
572
+
573
+ # reduce 15 omitted
574
+
575
+ # reduce 16 omitted
576
+
577
+ # reduce 17 omitted
578
+
579
+ # reduce 18 omitted
580
+
581
+ module_eval(<<'.,.,', 'parser.y', 46)
582
+ def _reduce_19(val, _values)
583
+ k=val[1].keys.first; val[0][k] = val[1][k]; val[0]
584
+ end
585
+ .,.,
586
+
587
+ module_eval(<<'.,.,', 'parser.y', 48)
588
+ def _reduce_20(val, _values)
589
+ { val[1] => val[3] }
590
+ end
591
+ .,.,
592
+
593
+ # reduce 21 omitted
594
+
595
+ module_eval(<<'.,.,', 'parser.y', 52)
596
+ def _reduce_22(val, _values)
597
+ val[0].to_i
598
+ end
599
+ .,.,
600
+
601
+ # reduce 23 omitted
602
+
603
+ # reduce 24 omitted
604
+
605
+ # reduce 25 omitted
606
+
607
+ # reduce 26 omitted
608
+
609
+ # reduce 27 omitted
610
+
611
+ module_eval(<<'.,.,', 'parser.y', 59)
612
+ def _reduce_28(val, _values)
613
+ {}
614
+ end
615
+ .,.,
616
+
617
+ module_eval(<<'.,.,', 'parser.y', 60)
618
+ def _reduce_29(val, _values)
619
+ val[1]
620
+ end
621
+ .,.,
622
+
623
+ module_eval(<<'.,.,', 'parser.y', 62)
624
+ def _reduce_30(val, _values)
625
+ val[0]
626
+ end
627
+ .,.,
628
+
629
+ module_eval(<<'.,.,', 'parser.y', 63)
630
+ def _reduce_31(val, _values)
631
+ k=val[2].keys.first; val[0][k] = val[2][k]; val[0]
632
+ end
633
+ .,.,
634
+
635
+ module_eval(<<'.,.,', 'parser.y', 65)
636
+ def _reduce_32(val, _values)
637
+ { val[0] => val[2] }
638
+ end
639
+ .,.,
640
+
641
+ module_eval(<<'.,.,', 'parser.y', 68)
642
+ def _reduce_33(val, _values)
643
+ []
644
+ end
645
+ .,.,
646
+
647
+ module_eval(<<'.,.,', 'parser.y', 69)
648
+ def _reduce_34(val, _values)
649
+ val[2]
650
+ end
651
+ .,.,
652
+
653
+ # reduce 35 omitted
654
+
655
+ module_eval(<<'.,.,', 'parser.y', 72)
656
+ def _reduce_36(val, _values)
657
+ val[0].push( val[2][0] ); val[0]
658
+ end
659
+ .,.,
660
+
661
+ module_eval(<<'.,.,', 'parser.y', 74)
662
+ def _reduce_37(val, _values)
663
+ [ val[0] ]
664
+ end
665
+ .,.,
666
+
667
+ module_eval(<<'.,.,', 'parser.y', 77)
668
+ def _reduce_38(val, _values)
669
+ []
670
+ end
671
+ .,.,
672
+
673
+ module_eval(<<'.,.,', 'parser.y', 78)
674
+ def _reduce_39(val, _values)
675
+ val[1]
676
+ end
677
+ .,.,
678
+
679
+ # reduce 40 omitted
680
+
681
+ module_eval(<<'.,.,', 'parser.y', 81)
682
+ def _reduce_41(val, _values)
683
+ val[0].push( val[2][0] ); val[0]
684
+ end
685
+ .,.,
686
+
687
+ module_eval(<<'.,.,', 'parser.y', 83)
688
+ def _reduce_42(val, _values)
689
+ [ val[0] ]
690
+ end
691
+ .,.,
692
+
693
+ def _reduce_none(val, _values)
694
+ val[0]
695
+ end
696
+
697
+ end # class Tla2DotParser
698
+
699
+
700
+ if $0 == __FILE__
701
+ src = <<EOS
702
+ {
703
+ name => MyName,
704
+ id => MyIdent
705
+ }
706
+ EOS
707
+ puts 'Parsing (String):'
708
+ print src
709
+ puts
710
+ puts 'Result (Ruby Object):'
711
+ p HashParser.new.parse(src)
712
+ end