tla-parser-s 0.1.2 → 0.2.2
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/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
|
|