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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f9d948ffca5a15da6675b14f14e17e5181615d2b
4
- data.tar.gz: cbbb074f624f0afbc29a579bb0fe7a4afa5d3c9d
3
+ metadata.gz: 3e456bcc271a0ec3f6a7b5f71112eb11b33ae320
4
+ data.tar.gz: b4dfe0d536c58a28f9963c149d350e291583dfdd
5
5
  SHA512:
6
- metadata.gz: 502e237ae5b32370fbfe1df73231fb90f56f7659a3af762442764d6f8e7de1ae6fa578a3872379f394ecdb549aaceb5f19f345a426b81b312f422bd763c766d6
7
- data.tar.gz: f54fe71c01a2f878f322afe41c79ac1a621ecc92b599e8359c80032d48e5fadae43c1d89da9faa9bb8b10c794028669314a020487b4f8c58c971e883f7deedda
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.1.2$
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.2
1
+ 0.2.2
@@ -28,9 +28,9 @@ module TlaParserS
28
28
 
29
29
  # @return [String] lvalue
30
30
  def lvalue
31
- # n = recursive_select( Sexp::Root ).first
31
+ # n = recursive_select( SbuilderSexp::Root ).first
32
32
  # return nil unless n
33
- recursive_select( Sexp::Identifier ).first.node_value
33
+ recursive_select( SbuilderSexp::Identifier ).first.node_value
34
34
  end
35
35
 
36
36
 
@@ -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 = SexpParser.new
56
+ @@parser = SbuilderSexpParser.new
57
57
  @@parser
58
58
  end
59
59
 
@@ -1,6 +1,6 @@
1
1
  require_relative 'lvalue'
2
2
 
3
- module Sexp
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( Sexp::Directive )
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( Sexp::Callable )
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( Sexp::Define )
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 ':node_type', :value properties
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( Sexp::Identifier)
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( Sexp::VariableDef).first.recursive_select( Sexp::Identifier )
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( Sexp::AbstactExpression )
109
- expressions = elements && elements.select { |e| e.is_a?( Sexp::AbstactExpression ) }
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( Sexp::Operator )
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( Sexp::AbstactExpression )
187
- super.select { |e| !e.is_a?(Sexp::UnitExpression) }
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?( Sexp::UnitExpression )}.first
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( Sexp::AbstactExpression )
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( Sexp::AbstactExpression).first
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
- # 'Sexp::UnitExpression', which define record access by value or by name
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( Sexp::UnitExpression ).first
237
- # down = recursive_select( Sexp::RecordField ).first
236
+ down = recursive_select( SbuilderSexp::UnitExpression ).first
237
+ # down = recursive_select( SbuilderSexp::RecordField ).first
238
238
  # return nil unless down
239
- # down.recursive_select( Sexp::RecordField ).first
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( Sexp::AbstactExpression ).first
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( Sexp::Identifier ).first.node_value
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( Sexp::Expression )
273
+ recursive_select( SbuilderSexp::Expression )
274
274
  end
275
275
 
276
276
  def record_field_node
277
- recursive_select( Sexp::RecordField ).first
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( Sexp::Operator ).first
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( Sexp::IfExpressionCondition ).first.recursive_select(Sexp::Expression).first
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( Sexp::IfExpressionThen ).first.recursive_select(Sexp::Expression).first end
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( Sexp::IfExpressionElse ).first
346
+ tree_node = recursive_select( SbuilderSexp::IfExpressionElse ).first
347
347
  return tree_node unless tree_node
348
- tree_node.recursive_select(Sexp::Expression).first
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( Sexp::BoundInExpression ).first
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( Sexp::BindsInExpression ).first.recursive_select( Sexp::BoundInExpression )
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 variables.
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?( Sexp::Identifier ) }.first
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?( Sexp::Expression ) }.first
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( Sexp::RecordExcepBase ).first.recursive_select( Sexp::Expression ).first
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( Sexp::RecordExceptField ).select{ |f| f.elements && f.elements.any? }
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( Sexp::LValue ).first
521
+ recursive_select( SbuilderSexp::LValue ).first
493
522
  end
494
523
  def rvalue_expression
495
524
  # first is expression for lvalue
496
- recursive_select( Sexp::Expression ).last
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( Sexp::RecordElement )
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( Sexp::RecordField ).first
556
+ down = recursive_select( SbuilderSexp::RecordField ).first
528
557
  return nil unless down
529
- down.recursive_select( Sexp::RecordField ).first
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( Sexp::Expression )
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( Sexp::BoundInExpression ).first
620
+ ret = recursive_select( SbuilderSexp::BoundInExpression ).first
591
621
  return nil unless ret
592
- ret = ret.recursive_select( Sexp::BoundInExpression ).first
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( Sexp::SetExpressionDef )
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( Sexp::SetExpression ).first
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( Sexp::Expression )
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( Sexp::AbstactExpression ).first
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( Sexp::UnitExpression ).first
670
- # down = recursive_select( Sexp::RecordField ).first
755
+ down = recursive_select( SbuilderSexp::UnitExpression ).first
756
+ # down = recursive_select( SbuilderSexp::RecordField ).first
671
757
  # return nil unless down
672
- # down.recursive_select( Sexp::RecordField ).first
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
- field_value_expression && field_value_expression.expression_val
767
+ return true if field_value_expression
682
768
  end
683
769
 
684
770
  def field_value_expression
685
- recursive_select( Sexp::AbstactExpression ).first
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( Sexp::AbstactExpression ).first
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( Sexp::UnitExpression ).first
698
- # down = recursive_select( Sexp::RecordField ).first
785
+ down = recursive_select( SbuilderSexp::UnitExpression ).first
786
+ # down = recursive_select( SbuilderSexp::RecordField ).first
699
787
  # return nil unless down
700
- # down.recursive_select( Sexp::RecordField ).first
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( Sexp::Label ).first
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?( Sexp::Label )
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( Sexp::UnlabeledStatement ).first
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(Sexp::StatementList).first.recursive_select(Sexp::Statement)
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( Sexp::Identifier).map{ |r| r.node_value }.first
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( Sexp::Expression).first
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( Sexp::LValue).first
967
+ recursive_select( SbuilderSexp::LValue).first
880
968
  end
881
969
 
882
970
  # @return [Expression] expression to assign
883
971
  def rvalue
884
- recursive_select( Sexp::Expression).first
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( Sexp::Expression).first
998
+ recursive_select( SbuilderSexp::Expression).first
897
999
  end
898
1000
 
899
1001
  def true_or_else
900
- recursive_select( Sexp::Statement)
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( Sexp::Statement)
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( Sexp::Expression).first
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( Sexp::Identifier).map{ |r| r.node_value }.first
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( Sexp::Expression)
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(Sexp::Identifier).first.node_value
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( Sexp::Identifier ).map { |i| i.node_value }
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(Sexp::Identifier).first.node_value
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(Sexp::Parameters)
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(Sexp::Statement).first
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(Sexp::ProcVariables)
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(Sexp::VariableDef)
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(Sexp::Expression)
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(Sexp::Identifier).first.node_value
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(Sexp::Identifier).first
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(Sexp::Expression).first
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
- # @return [Array] of 1 hash with :node_type, :value -properties
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( Sexp::Identifier ).first
1247
+ recursive_select( SbuilderSexp::Identifier ).first
1133
1248
  end
1134
1249
  def element_expression
1135
- recursive_select( Sexp::Expression ).first
1250
+ recursive_select( SbuilderSexp::Expression ).first
1136
1251
  end
1137
1252
  end
1138
1253