tla-parser-s 0.1.2 → 0.2.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/VERSION +1 -1
- data/lib/parser/lvalue.rb +2 -2
- data/lib/parser/parser.rb +1 -1
- data/lib/parser/parser_nodes.rb +200 -85
- data/lib/parser/parser_sexp.treetop +39 -7
- data/lib/semantics/context.rb +113 -55
- data/lib/semantics/resolver.rb +206 -58
- data/lib/semantics/symbol_table.rb +45 -11
- data/lib/utils/logger.rb +2 -1
- data/spec/fixtures/resolver1/op4.tla +2 -0
- data/spec/fixtures/resolver1/op_let.tla +1 -0
- data/spec/fixtures/resolver1/op_tail_chg.tla +1 -0
- data/spec/fixtures/resolver1/var_rec_expr_add.tla +3 -0
- data/spec/parser/parser_fixtures_spec.rb +4 -4
- data/spec/parser/parser_spec.rb +177 -12
- data/spec/semantics/context_spec.rb +52 -0
- data/spec/semantics/resolver_spec.rb +106 -11
- data/spec/semantics/symbol_table_spec.rb +6 -4
- metadata +6 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3e456bcc271a0ec3f6a7b5f71112eb11b33ae320
|
4
|
+
data.tar.gz: b4dfe0d536c58a28f9963c149d350e291583dfdd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8401edf952eedba3bfc76ae0a08ffbab159dbd90481c82d48de19123bb90a9167369d01d624d16c63ed7c43956371f18ca182e9aedcfdf657ea5dab2a67f9bdf
|
7
|
+
data.tar.gz: c2e9d8063ef23e14c45f430568281f58e10b3eb6c72af478cb420828ca3eceb4443faa21e6ed0e312a012233149e3e2f0d35ad2a478ad9be22b76b171ba83eba
|
data/README.md
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
[Up](../index.php) [Readme](README.html) [Releases](RELEASES.html) [Todo](TODO.html)
|
3
3
|
|
4
4
|
|
5
|
-
# tla-parser-s - TLA+ language parser (for tla-sbuilder) - $Release:0.
|
5
|
+
# tla-parser-s - TLA+ language parser (for tla-sbuilder) - $Release:0.2.2$
|
6
6
|
|
7
7
|
A Ruby library for parsing
|
8
8
|
[TLA+ language](http://research.microsoft.com/en-us/um/people/lamport/tla/book.html).
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.2.2
|
data/lib/parser/lvalue.rb
CHANGED
@@ -28,9 +28,9 @@ module TlaParserS
|
|
28
28
|
|
29
29
|
# @return [String] lvalue
|
30
30
|
def lvalue
|
31
|
-
# n = recursive_select(
|
31
|
+
# n = recursive_select( SbuilderSexp::Root ).first
|
32
32
|
# return nil unless n
|
33
|
-
recursive_select(
|
33
|
+
recursive_select( SbuilderSexp::Identifier ).first.node_value
|
34
34
|
end
|
35
35
|
|
36
36
|
|
data/lib/parser/parser.rb
CHANGED
@@ -53,7 +53,7 @@ module TlaParserS
|
|
53
53
|
parser_path = File.join( base_path, 'parser_sexp.treetop')
|
54
54
|
@logger.info( "#{__method__} loading parser from parser path #{parser_path}" )
|
55
55
|
Treetop.load( parser_path)
|
56
|
-
@@parser =
|
56
|
+
@@parser = SbuilderSexpParser.new
|
57
57
|
@@parser
|
58
58
|
end
|
59
59
|
|
data/lib/parser/parser_nodes.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
require_relative 'lvalue'
|
2
2
|
|
3
|
-
module
|
3
|
+
module SbuilderSexp
|
4
4
|
|
5
5
|
# ------------------------------------------------------------------
|
6
6
|
# Abstract
|
@@ -32,7 +32,7 @@ module Sexp
|
|
32
32
|
|
33
33
|
# @return [Directive:array] of parses' tree nodes
|
34
34
|
def directives
|
35
|
-
recursive_select(
|
35
|
+
recursive_select( SbuilderSexp::Directive )
|
36
36
|
end
|
37
37
|
|
38
38
|
def directive_definitions
|
@@ -41,18 +41,18 @@ module Sexp
|
|
41
41
|
|
42
42
|
# @return [Callable:array] of 'Callable' tree nodes
|
43
43
|
def callables
|
44
|
-
recursive_select(
|
44
|
+
recursive_select( SbuilderSexp::Callable )
|
45
45
|
end
|
46
46
|
|
47
47
|
# @return [array] of 'Define' tree nodes
|
48
48
|
def defines
|
49
|
-
recursive_select(
|
49
|
+
recursive_select( SbuilderSexp::Define )
|
50
50
|
end
|
51
51
|
|
52
52
|
# Snippets is main level parse target, and it adds to symbol table
|
53
53
|
# base context entries for 'Define' nodes
|
54
54
|
#
|
55
|
-
# @return [Array] of hash with
|
55
|
+
# @return [Array] of hash with {:node_type, :value, :tree }
|
56
56
|
#
|
57
57
|
def symbol_definitions
|
58
58
|
defines.map { |c| { :node_type => c.node_type, :value => c.name, :tree => c } }
|
@@ -66,7 +66,7 @@ module Sexp
|
|
66
66
|
class IdentifierList <Root
|
67
67
|
|
68
68
|
def identifier_nodes
|
69
|
-
recursive_select(
|
69
|
+
recursive_select( SbuilderSexp::Identifier)
|
70
70
|
end
|
71
71
|
def identifiers
|
72
72
|
identifier_nodes.map{ |r| r.value }
|
@@ -82,7 +82,7 @@ module Sexp
|
|
82
82
|
|
83
83
|
class ProcVariables <IdentifierList
|
84
84
|
def identifier_nodes
|
85
|
-
recursive_select(
|
85
|
+
recursive_select( SbuilderSexp::VariableDef).first.recursive_select( SbuilderSexp::Identifier )
|
86
86
|
end
|
87
87
|
|
88
88
|
end
|
@@ -105,8 +105,8 @@ module Sexp
|
|
105
105
|
|
106
106
|
# @return [AbstractExpression] sub expressions in a binary tree
|
107
107
|
def expressions
|
108
|
-
# expressions = recursive_select(
|
109
|
-
expressions = elements && elements.select { |e| e.is_a?(
|
108
|
+
# expressions = recursive_select( SbuilderSexp::AbstactExpression )
|
109
|
+
expressions = elements && elements.select { |e| e.is_a?( SbuilderSexp::AbstactExpression ) }
|
110
110
|
# raise "Parser error - compound expression should build binary tree" if expressions && expressios.length >2
|
111
111
|
|
112
112
|
end
|
@@ -171,7 +171,7 @@ module Sexp
|
|
171
171
|
# @return [String] operator to use (nil if no rhs, else rhs.operator)
|
172
172
|
def operator
|
173
173
|
return nil if !has_rhs
|
174
|
-
rhs_operators = expressions[1].recursive_select(
|
174
|
+
rhs_operators = expressions[1].recursive_select( SbuilderSexp::Operator )
|
175
175
|
return rhs_operators && rhs_operators.any? && rhs_operators.first.node_value
|
176
176
|
end
|
177
177
|
|
@@ -183,8 +183,8 @@ module Sexp
|
|
183
183
|
# to UnitExpressions, instead yield block iterates using 'attribute_accessors'
|
184
184
|
|
185
185
|
def expressions
|
186
|
-
# expressions = recursive_select(
|
187
|
-
super.select { |e| !e.is_a?(
|
186
|
+
# expressions = recursive_select( SbuilderSexp::AbstactExpression )
|
187
|
+
super.select { |e| !e.is_a?(SbuilderSexp::UnitExpression) }
|
188
188
|
end
|
189
189
|
|
190
190
|
# AbstactExpression.travers yield if non-nil
|
@@ -195,16 +195,16 @@ module Sexp
|
|
195
195
|
# Access record by field name or by value
|
196
196
|
# @return [AbstactExpression:Array] to acccess record fields
|
197
197
|
def attribute_accessors
|
198
|
-
deffi = elements.select{ |e| e.is_a?(
|
198
|
+
deffi = elements.select{ |e| e.is_a?( SbuilderSexp::UnitExpression )}.first
|
199
199
|
return unless deffi && !deffi.text_value.empty?
|
200
|
-
deffi = deffi.recursive_select(
|
200
|
+
deffi = deffi.recursive_select( SbuilderSexp::AbstactExpression )
|
201
201
|
return deffi
|
202
202
|
end
|
203
203
|
|
204
204
|
|
205
205
|
# @return [boolean] true if expression defines record accessor
|
206
206
|
def has_attribute_accessors
|
207
|
-
attribute_accessors && attribute_accessors.any?
|
207
|
+
attribute_accessors && attribute_accessors.any?
|
208
208
|
end
|
209
209
|
|
210
210
|
end
|
@@ -222,21 +222,21 @@ module Sexp
|
|
222
222
|
|
223
223
|
# @return [AbstactExpression] for the LValue
|
224
224
|
def expression
|
225
|
-
recursive_select(
|
225
|
+
recursive_select( SbuilderSexp::AbstactExpression).first
|
226
226
|
end
|
227
227
|
|
228
228
|
# implements lvalue
|
229
229
|
include TlaParserS::LValue
|
230
230
|
|
231
231
|
# Implement traverse down for 'recurse_lvalue'. In my case recurse
|
232
|
-
# '
|
232
|
+
# 'SbuilderSexp::UnitExpression', which define record access by value or by name
|
233
233
|
#
|
234
234
|
# @return [nil|RecordField] down next level in hierarchy
|
235
235
|
def lvalue_down
|
236
|
-
down = recursive_select(
|
237
|
-
# down = recursive_select(
|
236
|
+
down = recursive_select( SbuilderSexp::UnitExpression ).first
|
237
|
+
# down = recursive_select( SbuilderSexp::RecordField ).first
|
238
238
|
# return nil unless down
|
239
|
-
# down.recursive_select(
|
239
|
+
# down.recursive_select( SbuilderSexp::RecordField ).first
|
240
240
|
end
|
241
241
|
|
242
242
|
end
|
@@ -251,7 +251,7 @@ module Sexp
|
|
251
251
|
# @return [nil|AbstractExpression] down next level in hierarchy
|
252
252
|
|
253
253
|
def lvalue_down
|
254
|
-
down = recursive_select(
|
254
|
+
down = recursive_select( SbuilderSexp::AbstactExpression ).first
|
255
255
|
end
|
256
256
|
|
257
257
|
|
@@ -266,15 +266,15 @@ module Sexp
|
|
266
266
|
end
|
267
267
|
|
268
268
|
def operator_name
|
269
|
-
recursive_select(
|
269
|
+
recursive_select( SbuilderSexp::Identifier ).first.node_value
|
270
270
|
end
|
271
271
|
# @return [Expression:Array] list or arguments
|
272
272
|
def arguments
|
273
|
-
recursive_select(
|
273
|
+
recursive_select( SbuilderSexp::Expression )
|
274
274
|
end
|
275
275
|
|
276
276
|
def record_field_node
|
277
|
-
recursive_select(
|
277
|
+
recursive_select( SbuilderSexp::RecordField ).first
|
278
278
|
end
|
279
279
|
def record_field
|
280
280
|
node = record_field_node
|
@@ -297,7 +297,7 @@ module Sexp
|
|
297
297
|
end
|
298
298
|
|
299
299
|
def operator_node
|
300
|
-
recursive_select(
|
300
|
+
recursive_select( SbuilderSexp::Operator ).first
|
301
301
|
end
|
302
302
|
def operator
|
303
303
|
operator_node.text_value
|
@@ -334,18 +334,18 @@ module Sexp
|
|
334
334
|
# Node for condition
|
335
335
|
# @return [Expression] for IF condition
|
336
336
|
def condition_node
|
337
|
-
recursive_select(
|
337
|
+
recursive_select( SbuilderSexp::IfExpressionCondition ).first.recursive_select(SbuilderSexp::Expression).first
|
338
338
|
end
|
339
339
|
|
340
340
|
# @return [Expression] for THEN expression
|
341
341
|
def then_expression_node
|
342
|
-
recursive_select(
|
342
|
+
recursive_select( SbuilderSexp::IfExpressionThen ).first.recursive_select(SbuilderSexp::Expression).first end
|
343
343
|
|
344
344
|
# @return [Expression] for ELSE expression
|
345
345
|
def else_expression_node
|
346
|
-
tree_node = recursive_select(
|
346
|
+
tree_node = recursive_select( SbuilderSexp::IfExpressionElse ).first
|
347
347
|
return tree_node unless tree_node
|
348
|
-
tree_node.recursive_select(
|
348
|
+
tree_node.recursive_select(SbuilderSexp::Expression).first
|
349
349
|
end
|
350
350
|
|
351
351
|
def name
|
@@ -353,12 +353,41 @@ module Sexp
|
|
353
353
|
end
|
354
354
|
|
355
355
|
end
|
356
|
+
|
357
|
+
class LetExpression < SimpleExpression
|
358
|
+
|
359
|
+
def operatorDef
|
360
|
+
recursive_select( SbuilderSexp::OperatorDef ).first
|
361
|
+
end
|
362
|
+
|
363
|
+
def letExpression
|
364
|
+
elements[1]
|
365
|
+
end
|
366
|
+
|
367
|
+
# Return entries for symbol table. In this case, add just variable
|
368
|
+
# in operator definition
|
369
|
+
#
|
370
|
+
# @return [Array] of 1 hash with {:node_type,:value}
|
371
|
+
def symbol_definitions
|
372
|
+
[ { :node_type => node_type, :value => operatorDef.name } ]
|
373
|
+
end
|
374
|
+
|
375
|
+
# For documentation purposes symbol table context needs a name
|
376
|
+
# (For procedures, and macros name is ovbious. For a set
|
377
|
+
# expression we define name set a string "Set+<generator set>"
|
378
|
+
#
|
379
|
+
# @return [String] name identifying context in symbol table
|
380
|
+
def name
|
381
|
+
"LetExpr-??"
|
382
|
+
end
|
383
|
+
|
384
|
+
end
|
356
385
|
|
357
386
|
class ChooseExpression < SimpleExpression
|
358
387
|
|
359
388
|
# @return [BoundInExpression] root node for x \in S
|
360
389
|
def binds_node
|
361
|
-
recursive_select(
|
390
|
+
recursive_select( SbuilderSexp::BoundInExpression ).first
|
362
391
|
end
|
363
392
|
|
364
393
|
# Choose defines 'choose_expression' in left hand size
|
@@ -406,7 +435,7 @@ module Sexp
|
|
406
435
|
end
|
407
436
|
|
408
437
|
def binds_nodes
|
409
|
-
recursive_select(
|
438
|
+
recursive_select( SbuilderSexp::BindsInExpression ).first.recursive_select( SbuilderSexp::BoundInExpression )
|
410
439
|
end
|
411
440
|
|
412
441
|
# Quantification defines 'quantified_expression' in left hand size
|
@@ -428,7 +457,7 @@ module Sexp
|
|
428
457
|
|
429
458
|
# Some variables in 'constructor_expression' (most likely) refer
|
430
459
|
# to variable defined in set constructor generate. Return name of
|
431
|
-
# this
|
460
|
+
# this variable.
|
432
461
|
#
|
433
462
|
# @return [Array] of one hash with ':node_type',':value' properties
|
434
463
|
def symbol_definitions
|
@@ -441,10 +470,10 @@ module Sexp
|
|
441
470
|
|
442
471
|
class BoundInExpression < Root
|
443
472
|
def bind_var
|
444
|
-
elements.select{ |e| e.is_a?(
|
473
|
+
elements.select{ |e| e.is_a?( SbuilderSexp::Identifier ) }.first
|
445
474
|
end
|
446
475
|
def bind_set
|
447
|
-
elements.select{ |e| e.is_a?(
|
476
|
+
elements.select{ |e| e.is_a?( SbuilderSexp::Expression ) }.first
|
448
477
|
end
|
449
478
|
|
450
479
|
end
|
@@ -479,21 +508,21 @@ module Sexp
|
|
479
508
|
"exprsssion"
|
480
509
|
end
|
481
510
|
def record_base
|
482
|
-
recursive_select(
|
511
|
+
recursive_select( SbuilderSexp::RecordExcepBase ).first.recursive_select( SbuilderSexp::Expression ).first
|
483
512
|
end
|
484
513
|
def record_field_definitions
|
485
514
|
# rigth recursion results to empty RecordExceptField -node
|
486
|
-
recursive_select(
|
515
|
+
recursive_select( SbuilderSexp::RecordExceptField ).select{ |f| f.elements && f.elements.any? }
|
487
516
|
end
|
488
517
|
end
|
489
518
|
|
490
519
|
class RecordExceptField < Root
|
491
520
|
def lvalue_expression
|
492
|
-
recursive_select(
|
521
|
+
recursive_select( SbuilderSexp::LValue ).first
|
493
522
|
end
|
494
523
|
def rvalue_expression
|
495
524
|
# first is expression for lvalue
|
496
|
-
recursive_select(
|
525
|
+
recursive_select( SbuilderSexp::Expression ).last
|
497
526
|
end
|
498
527
|
end
|
499
528
|
|
@@ -509,7 +538,7 @@ module Sexp
|
|
509
538
|
|
510
539
|
# @return [RecordElement:Array] of record field definitions
|
511
540
|
def record_fields
|
512
|
-
ret = recursive_select(
|
541
|
+
ret = recursive_select( SbuilderSexp::RecordElement )
|
513
542
|
ret
|
514
543
|
end
|
515
544
|
|
@@ -524,9 +553,9 @@ module Sexp
|
|
524
553
|
# Implement traversal for 'recurse_lvalue'
|
525
554
|
# @return [nil|RecordField] down next level in hierarchy
|
526
555
|
def lvalue_down
|
527
|
-
down = recursive_select(
|
556
|
+
down = recursive_select( SbuilderSexp::RecordField ).first
|
528
557
|
return nil unless down
|
529
|
-
down.recursive_select(
|
558
|
+
down.recursive_select( SbuilderSexp::RecordField ).first
|
530
559
|
end
|
531
560
|
|
532
561
|
|
@@ -566,11 +595,12 @@ module Sexp
|
|
566
595
|
|
567
596
|
# @return [Expression:Array] of sequence expressions
|
568
597
|
def tuples
|
569
|
-
recursive_select(
|
598
|
+
recursive_select( SbuilderSexp::Expression )
|
570
599
|
end
|
571
600
|
end
|
572
601
|
|
573
602
|
|
603
|
+
|
574
604
|
class AbstractSetExpression < AbstactExpression
|
575
605
|
# AbstactExpression.traverse quit traversing the expression
|
576
606
|
def lhs_node
|
@@ -587,25 +617,25 @@ module Sexp
|
|
587
617
|
# @return [BoundInExpression|nil] syntax tree node defining
|
588
618
|
# generator variable and set
|
589
619
|
def binds_node
|
590
|
-
ret = recursive_select(
|
620
|
+
ret = recursive_select( SbuilderSexp::BoundInExpression ).first
|
591
621
|
return nil unless ret
|
592
|
-
ret = ret.recursive_select(
|
622
|
+
ret = ret.recursive_select( SbuilderSexp::BoundInExpression ).first
|
593
623
|
# puts ret
|
594
624
|
ret
|
595
625
|
end
|
596
626
|
|
597
627
|
def set_expression
|
598
|
-
deffi = recursive_select(
|
628
|
+
deffi = recursive_select( SbuilderSexp::SetExpressionDef )
|
599
629
|
return nil unless deffi && deffi.any?
|
600
630
|
ret = deffi.first.elements[0]
|
601
|
-
# # ret = deffi.first.recursive_select(
|
631
|
+
# # ret = deffi.first.recursive_select( SbuilderSexp::SetExpression ).first
|
602
632
|
# puts "set_expression=#{ret.inspect}"
|
603
633
|
ret
|
604
634
|
end
|
605
635
|
|
606
636
|
# Elements defined on constructore
|
607
637
|
def set_elements
|
608
|
-
elems = recursive_select(
|
638
|
+
elems = recursive_select( SbuilderSexp::Expression )
|
609
639
|
elems
|
610
640
|
end
|
611
641
|
|
@@ -629,6 +659,55 @@ module Sexp
|
|
629
659
|
|
630
660
|
end
|
631
661
|
|
662
|
+
class FunctionExpression < AbstactExpression
|
663
|
+
|
664
|
+
def lhs_node
|
665
|
+
nil
|
666
|
+
end
|
667
|
+
|
668
|
+
|
669
|
+
# AbstactExpression.traverse calls in yield
|
670
|
+
def expression_val
|
671
|
+
true
|
672
|
+
end
|
673
|
+
|
674
|
+
def binds_node
|
675
|
+
ret = recursive_select( SbuilderSexp::BoundInExpression ).first
|
676
|
+
# return nil unless ret
|
677
|
+
# ret = ret.recursive_select( SbuilderSexp::BoundInExpression ).first
|
678
|
+
# # puts ret
|
679
|
+
# ret
|
680
|
+
end
|
681
|
+
|
682
|
+
def function_expression
|
683
|
+
elements[1]
|
684
|
+
end
|
685
|
+
|
686
|
+
# For documentation purposes symbol table context needs a name
|
687
|
+
# (For procedures, and macros name is ovbious. For a set
|
688
|
+
# expression we define name set a string "Set+<generator set>"
|
689
|
+
#
|
690
|
+
# @return [String] name identifying context in symbol table
|
691
|
+
def name
|
692
|
+
"Func-#{binds_node.bind_set.text_value}"
|
693
|
+
end
|
694
|
+
|
695
|
+
|
696
|
+
# Some variables in 'set_expression' (most likely) refer to
|
697
|
+
# variable defined in set constructor generate. Return name of
|
698
|
+
# this variables.
|
699
|
+
#
|
700
|
+
# @return [Hash:Array] with :node_type,:value, :tree -properties
|
701
|
+
def symbol_definitions
|
702
|
+
return [] unless binds_node
|
703
|
+
[ { :node_type => node_type, :value => binds_node.bind_var.expression_val, :tree=>binds_node } ]
|
704
|
+
end
|
705
|
+
|
706
|
+
|
707
|
+
|
708
|
+
end
|
709
|
+
|
710
|
+
|
632
711
|
class SetExpressionMap < AbstractSetExpression
|
633
712
|
end
|
634
713
|
|
@@ -653,10 +732,17 @@ module Sexp
|
|
653
732
|
|
654
733
|
|
655
734
|
class FieldByName < FieldBy
|
735
|
+
|
736
|
+
def name_expression
|
737
|
+
elements[0]
|
738
|
+
end
|
739
|
+
|
740
|
+
# ---
|
741
|
+
# depracted here down
|
656
742
|
|
657
743
|
# @return [AbstactExpression] defining the name
|
658
744
|
def field_name_expression
|
659
|
-
recursive_select(
|
745
|
+
recursive_select( SbuilderSexp::AbstactExpression ).first
|
660
746
|
end
|
661
747
|
|
662
748
|
def expression_val
|
@@ -666,10 +752,10 @@ module Sexp
|
|
666
752
|
# implements lvalue
|
667
753
|
include TlaParserS::LValue
|
668
754
|
def lvalue_down
|
669
|
-
down = recursive_select(
|
670
|
-
# down = recursive_select(
|
755
|
+
down = recursive_select( SbuilderSexp::UnitExpression ).first
|
756
|
+
# down = recursive_select( SbuilderSexp::RecordField ).first
|
671
757
|
# return nil unless down
|
672
|
-
# down.recursive_select(
|
758
|
+
# down.recursive_select( SbuilderSexp::RecordField ).first
|
673
759
|
end
|
674
760
|
|
675
761
|
|
@@ -678,26 +764,28 @@ module Sexp
|
|
678
764
|
class FieldByValue < FieldBy
|
679
765
|
|
680
766
|
def expression_val
|
681
|
-
|
767
|
+
return true if field_value_expression
|
682
768
|
end
|
683
769
|
|
684
770
|
def field_value_expression
|
685
|
-
recursive_select(
|
771
|
+
# recursive_select( SbuilderSexp::AbstactExpression ).first
|
772
|
+
elements[0]
|
686
773
|
end
|
774
|
+
|
687
775
|
|
688
776
|
|
689
777
|
# # @return [AbstactExpression] defining the value
|
690
778
|
# def val_expression
|
691
|
-
# recursive_select(
|
779
|
+
# recursive_select( SbuilderSexp::AbstactExpression ).first
|
692
780
|
# end
|
693
781
|
|
694
782
|
# implements lvalue
|
695
783
|
include TlaParserS::LValue
|
696
784
|
def lvalue_down
|
697
|
-
down = recursive_select(
|
698
|
-
# down = recursive_select(
|
785
|
+
down = recursive_select( SbuilderSexp::UnitExpression ).first
|
786
|
+
# down = recursive_select( SbuilderSexp::RecordField ).first
|
699
787
|
# return nil unless down
|
700
|
-
# down.recursive_select(
|
788
|
+
# down.recursive_select( SbuilderSexp::RecordField ).first
|
701
789
|
end
|
702
790
|
|
703
791
|
end
|
@@ -776,10 +864,10 @@ module Sexp
|
|
776
864
|
# 'recursive_select'
|
777
865
|
def find_labelnode
|
778
866
|
|
779
|
-
# return labelnode = recursive_select(
|
867
|
+
# return labelnode = recursive_select( SbuilderSexp::Label ).first
|
780
868
|
if !elements.nil? then
|
781
869
|
elements.each do |e|
|
782
|
-
return e if e.is_a?(
|
870
|
+
return e if e.is_a?( SbuilderSexp::Label )
|
783
871
|
end
|
784
872
|
end
|
785
873
|
# Label node not found
|
@@ -795,7 +883,7 @@ module Sexp
|
|
795
883
|
|
796
884
|
# @return [UnlabeledStatement:TreeNode] TLA -language statement
|
797
885
|
def get_statement
|
798
|
-
ret = recursive_select(
|
886
|
+
ret = recursive_select( SbuilderSexp::UnlabeledStatement ).first
|
799
887
|
ret
|
800
888
|
end
|
801
889
|
|
@@ -845,7 +933,7 @@ module Sexp
|
|
845
933
|
class CompoundStatement < UnlabeledStatement
|
846
934
|
|
847
935
|
def statements
|
848
|
-
stmts=recursive_select(
|
936
|
+
stmts=recursive_select(SbuilderSexp::StatementList).first.recursive_select(SbuilderSexp::Statement)
|
849
937
|
stmts
|
850
938
|
|
851
939
|
end
|
@@ -858,7 +946,7 @@ module Sexp
|
|
858
946
|
class Goto < UnlabeledStatement
|
859
947
|
|
860
948
|
def goto_label
|
861
|
-
recursive_select(
|
949
|
+
recursive_select( SbuilderSexp::Identifier).map{ |r| r.node_value }.first
|
862
950
|
end
|
863
951
|
|
864
952
|
end
|
@@ -867,7 +955,7 @@ module Sexp
|
|
867
955
|
|
868
956
|
# @return [Expression] to print
|
869
957
|
def print_expression
|
870
|
-
recursive_select(
|
958
|
+
recursive_select( SbuilderSexp::Expression).first
|
871
959
|
end
|
872
960
|
|
873
961
|
end
|
@@ -876,12 +964,13 @@ module Sexp
|
|
876
964
|
|
877
965
|
# @return [LValue] where to assign to
|
878
966
|
def lvalue
|
879
|
-
recursive_select(
|
967
|
+
recursive_select( SbuilderSexp::LValue).first
|
880
968
|
end
|
881
969
|
|
882
970
|
# @return [Expression] expression to assign
|
883
971
|
def rvalue
|
884
|
-
|
972
|
+
elements[1]
|
973
|
+
# recursive_select( SbuilderSexp::Expression).first
|
885
974
|
end
|
886
975
|
|
887
976
|
end
|
@@ -890,14 +979,27 @@ module Sexp
|
|
890
979
|
class Return < UnlabeledStatement
|
891
980
|
end
|
892
981
|
|
982
|
+
class WithStatement < UnlabeledStatement
|
983
|
+
|
984
|
+
def with_expression
|
985
|
+
recursive_select( SbuilderSexp::Expression).first
|
986
|
+
end
|
987
|
+
|
988
|
+
def with_statement
|
989
|
+
recursive_select( SbuilderSexp::Statement).first
|
990
|
+
end
|
991
|
+
|
992
|
+
|
993
|
+
end
|
994
|
+
|
893
995
|
class Conditional < UnlabeledStatement
|
894
996
|
|
895
997
|
def condition
|
896
|
-
recursive_select(
|
998
|
+
recursive_select( SbuilderSexp::Expression).first
|
897
999
|
end
|
898
1000
|
|
899
1001
|
def true_or_else
|
900
|
-
recursive_select(
|
1002
|
+
recursive_select( SbuilderSexp::Statement)
|
901
1003
|
end
|
902
1004
|
|
903
1005
|
def if_true
|
@@ -915,7 +1017,7 @@ module Sexp
|
|
915
1017
|
|
916
1018
|
# Return array of choices
|
917
1019
|
def choices
|
918
|
-
recursive_select(
|
1020
|
+
recursive_select( SbuilderSexp::Statement)
|
919
1021
|
end
|
920
1022
|
|
921
1023
|
end
|
@@ -924,7 +1026,7 @@ module Sexp
|
|
924
1026
|
class Assert < UnlabeledStatement
|
925
1027
|
|
926
1028
|
def assertion
|
927
|
-
recursive_select(
|
1029
|
+
recursive_select( SbuilderSexp::Expression).first
|
928
1030
|
end
|
929
1031
|
|
930
1032
|
end
|
@@ -932,7 +1034,7 @@ module Sexp
|
|
932
1034
|
class Called < UnlabeledStatement
|
933
1035
|
|
934
1036
|
def called
|
935
|
-
recursive_select(
|
1037
|
+
recursive_select( SbuilderSexp::Identifier).map{ |r| r.node_value }.first
|
936
1038
|
end
|
937
1039
|
|
938
1040
|
def statement_val
|
@@ -941,7 +1043,7 @@ module Sexp
|
|
941
1043
|
|
942
1044
|
# @return [Array] actual parameters parsed as 'Expression' nodes
|
943
1045
|
def actual_parameters
|
944
|
-
recursive_select(
|
1046
|
+
recursive_select( SbuilderSexp::Expression)
|
945
1047
|
end
|
946
1048
|
|
947
1049
|
|
@@ -966,7 +1068,7 @@ module Sexp
|
|
966
1068
|
class Label < Root
|
967
1069
|
|
968
1070
|
def label
|
969
|
-
recursive_select(
|
1071
|
+
recursive_select(SbuilderSexp::Identifier).first.node_value
|
970
1072
|
end
|
971
1073
|
|
972
1074
|
def node_value
|
@@ -981,7 +1083,7 @@ module Sexp
|
|
981
1083
|
|
982
1084
|
# @return [String:Array] of directive names
|
983
1085
|
def directives
|
984
|
-
recursive_select(
|
1086
|
+
recursive_select( SbuilderSexp::Identifier ).map { |i| i.node_value }
|
985
1087
|
end
|
986
1088
|
|
987
1089
|
|
@@ -993,12 +1095,23 @@ module Sexp
|
|
993
1095
|
class Assumption < Directive
|
994
1096
|
end
|
995
1097
|
|
1098
|
+
class Recursive < Directive
|
1099
|
+
def name
|
1100
|
+
directives.first
|
1101
|
+
end
|
1102
|
+
|
1103
|
+
def cardinality
|
1104
|
+
directives.length - 1
|
1105
|
+
end
|
1106
|
+
end
|
1107
|
+
|
1108
|
+
|
996
1109
|
# ------------------------------------------------------------------
|
997
1110
|
# callable (procedures, macros, processes?)
|
998
1111
|
|
999
1112
|
class Define < Root
|
1000
1113
|
def name
|
1001
|
-
recursive_select(
|
1114
|
+
recursive_select(SbuilderSexp::Identifier).first.node_value
|
1002
1115
|
end
|
1003
1116
|
|
1004
1117
|
end
|
@@ -1006,7 +1119,7 @@ module Sexp
|
|
1006
1119
|
class Callable < Define
|
1007
1120
|
|
1008
1121
|
def parameters_node
|
1009
|
-
tree_nodes = recursive_select(
|
1122
|
+
tree_nodes = recursive_select(SbuilderSexp::Parameters)
|
1010
1123
|
return tree_nodes.first if tree_nodes
|
1011
1124
|
end
|
1012
1125
|
def parameters
|
@@ -1016,7 +1129,7 @@ module Sexp
|
|
1016
1129
|
|
1017
1130
|
|
1018
1131
|
def body_node
|
1019
|
-
ret = recursive_select(
|
1132
|
+
ret = recursive_select(SbuilderSexp::Statement).first
|
1020
1133
|
ret
|
1021
1134
|
end
|
1022
1135
|
def body
|
@@ -1060,14 +1173,14 @@ module Sexp
|
|
1060
1173
|
|
1061
1174
|
# @return [Nil|ProcVariables] of variable definition node for procedure
|
1062
1175
|
def procedure_variables_node
|
1063
|
-
tree_nodes = recursive_select(
|
1176
|
+
tree_nodes = recursive_select(SbuilderSexp::ProcVariables)
|
1064
1177
|
return tree_nodes.first if tree_nodes
|
1065
1178
|
end
|
1066
1179
|
|
1067
1180
|
# @return [VariableDef:Array] variable declarations
|
1068
1181
|
def variable_declarations
|
1069
1182
|
return [] unless procedure_variables_node
|
1070
|
-
return procedure_variables_node.recursive_select(
|
1183
|
+
return procedure_variables_node.recursive_select(SbuilderSexp::VariableDef)
|
1071
1184
|
end
|
1072
1185
|
|
1073
1186
|
def procedure_variables
|
@@ -1092,7 +1205,7 @@ module Sexp
|
|
1092
1205
|
|
1093
1206
|
# For operator no body:
|
1094
1207
|
def body_node
|
1095
|
-
tree_nodes = recursive_select(
|
1208
|
+
tree_nodes = recursive_select(SbuilderSexp::Expression)
|
1096
1209
|
return tree_nodes.first if tree_nodes
|
1097
1210
|
end
|
1098
1211
|
end
|
@@ -1104,23 +1217,25 @@ module Sexp
|
|
1104
1217
|
|
1105
1218
|
#
|
1106
1219
|
def name
|
1107
|
-
recursive_select(
|
1220
|
+
# recursive_select(SbuilderSexp::Identifier).first.node_value
|
1221
|
+
variable.node_value
|
1108
1222
|
end
|
1109
1223
|
|
1110
1224
|
# @return [Identifier] tree node for variable defined
|
1111
1225
|
def variable
|
1112
|
-
tree_nodes = recursive_select(
|
1226
|
+
tree_nodes = recursive_select(SbuilderSexp::Identifier).first
|
1113
1227
|
end
|
1114
1228
|
|
1115
1229
|
|
1116
1230
|
# @return [Expression] tree node for init expression
|
1117
1231
|
def init
|
1118
|
-
tree_nodes = recursive_select(
|
1232
|
+
tree_nodes = recursive_select(SbuilderSexp::Expression).first
|
1119
1233
|
end
|
1120
1234
|
|
1121
1235
|
# Return entries for symbol table. In this case, add just variable
|
1122
1236
|
# definition.
|
1123
|
-
#
|
1237
|
+
#
|
1238
|
+
# @return [Array] of 1 hash with {:node_type,:value}
|
1124
1239
|
def symbol_definitions
|
1125
1240
|
[ { :node_type => node_type, :value => name } ]
|
1126
1241
|
end
|
@@ -1129,10 +1244,10 @@ module Sexp
|
|
1129
1244
|
|
1130
1245
|
class RecordElement < Root
|
1131
1246
|
def element_name
|
1132
|
-
recursive_select(
|
1247
|
+
recursive_select( SbuilderSexp::Identifier ).first
|
1133
1248
|
end
|
1134
1249
|
def element_expression
|
1135
|
-
recursive_select(
|
1250
|
+
recursive_select( SbuilderSexp::Expression ).first
|
1136
1251
|
end
|
1137
1252
|
end
|
1138
1253
|
|