tp_plus 0.0.87 → 0.0.88

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.
Files changed (77) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +87 -87
  3. data/Rakefile +35 -35
  4. data/bin/tpp +92 -92
  5. data/lib/tp_plus/interpreter.rb +153 -152
  6. data/lib/tp_plus/namespace.rb +66 -66
  7. data/lib/tp_plus/nodes/abort_node.rb +9 -9
  8. data/lib/tp_plus/nodes/acc_node.rb +24 -19
  9. data/lib/tp_plus/nodes/address_node.rb +22 -22
  10. data/lib/tp_plus/nodes/argument_node.rb +20 -20
  11. data/lib/tp_plus/nodes/assignment_node.rb +52 -52
  12. data/lib/tp_plus/nodes/base_node.rb +9 -9
  13. data/lib/tp_plus/nodes/call_node.rb +34 -34
  14. data/lib/tp_plus/nodes/case_condition_node.rb +26 -26
  15. data/lib/tp_plus/nodes/case_node.rb +33 -33
  16. data/lib/tp_plus/nodes/comment_node.rb +18 -18
  17. data/lib/tp_plus/nodes/conditional_node.rb +60 -60
  18. data/lib/tp_plus/nodes/definition_node.rb +22 -22
  19. data/lib/tp_plus/nodes/digit_node.rb +22 -22
  20. data/lib/tp_plus/nodes/empty_stmt_node.rb +9 -9
  21. data/lib/tp_plus/nodes/eval_node.rb +13 -13
  22. data/lib/tp_plus/nodes/expression_node.rb +71 -68
  23. data/lib/tp_plus/nodes/for_node.rb +20 -20
  24. data/lib/tp_plus/nodes/header_node.rb +27 -27
  25. data/lib/tp_plus/nodes/indirect_node.rb +27 -27
  26. data/lib/tp_plus/nodes/inline_conditional_node.rb +36 -36
  27. data/lib/tp_plus/nodes/io_method_node.rb +55 -55
  28. data/lib/tp_plus/nodes/io_node.rb +31 -31
  29. data/lib/tp_plus/nodes/jpos_node.rb +13 -13
  30. data/lib/tp_plus/nodes/jump_node.rb +23 -23
  31. data/lib/tp_plus/nodes/label_definition_node.rb +21 -21
  32. data/lib/tp_plus/nodes/lpos_node.rb +13 -13
  33. data/lib/tp_plus/nodes/motion_node.rb +62 -62
  34. data/lib/tp_plus/nodes/namespace_node.rb +16 -16
  35. data/lib/tp_plus/nodes/namespaced_var_node.rb +38 -38
  36. data/lib/tp_plus/nodes/numreg_node.rb +26 -26
  37. data/lib/tp_plus/nodes/offset_node.rb +27 -27
  38. data/lib/tp_plus/nodes/operator_node.rb +78 -80
  39. data/lib/tp_plus/nodes/paren_expression_node.rb +17 -17
  40. data/lib/tp_plus/nodes/pause_node.rb +9 -9
  41. data/lib/tp_plus/nodes/position_data_node.rb +66 -66
  42. data/lib/tp_plus/nodes/position_node.rb +26 -26
  43. data/lib/tp_plus/nodes/posreg_node.rb +64 -64
  44. data/lib/tp_plus/nodes/raise_node.rb +13 -13
  45. data/lib/tp_plus/nodes/real_node.rb +27 -27
  46. data/lib/tp_plus/nodes/return_node.rb +9 -9
  47. data/lib/tp_plus/nodes/set_skip_node.rb +14 -14
  48. data/lib/tp_plus/nodes/skip_node.rb +22 -22
  49. data/lib/tp_plus/nodes/speed_node.rb +29 -29
  50. data/lib/tp_plus/nodes/string_node.rb +13 -13
  51. data/lib/tp_plus/nodes/string_register_node.rb +26 -26
  52. data/lib/tp_plus/nodes/termination_node.rb +29 -23
  53. data/lib/tp_plus/nodes/terminator_node.rb +16 -16
  54. data/lib/tp_plus/nodes/time_node.rb +24 -24
  55. data/lib/tp_plus/nodes/timer_method_node.rb +33 -33
  56. data/lib/tp_plus/nodes/timer_node.rb +16 -16
  57. data/lib/tp_plus/nodes/unary_expression_node.rb +40 -39
  58. data/lib/tp_plus/nodes/units_node.rb +20 -20
  59. data/lib/tp_plus/nodes/use_node.rb +21 -21
  60. data/lib/tp_plus/nodes/user_alarm_node.rb +16 -16
  61. data/lib/tp_plus/nodes/var_method_node.rb +23 -23
  62. data/lib/tp_plus/nodes/var_node.rb +39 -39
  63. data/lib/tp_plus/nodes/vision_register_node.rb +22 -22
  64. data/lib/tp_plus/nodes/wait_for_node.rb +57 -50
  65. data/lib/tp_plus/nodes/wait_until_node.rb +61 -61
  66. data/lib/tp_plus/nodes/while_node.rb +40 -40
  67. data/lib/tp_plus/parser.rb +1749 -1749
  68. data/lib/tp_plus/scanner.rb +295 -295
  69. data/lib/tp_plus/token.rb +101 -101
  70. data/lib/tp_plus/version.rb +3 -3
  71. data/lib/tp_plus.rb +72 -72
  72. data/test/test_helper.rb +5 -5
  73. data/test/tp_plus/test_interpreter.rb +1378 -1372
  74. data/test/tp_plus/test_parser.rb +502 -502
  75. data/test/tp_plus/test_scanner.rb +591 -591
  76. data/tp_plus.gemspec +31 -31
  77. metadata +4 -3
@@ -1,66 +1,66 @@
1
- module TPPlus
2
- module Nodes
3
- class PositionDataNode < BaseNode
4
- attr_reader :hash
5
- def initialize(hash)
6
- @hash = hash
7
- @ids = []
8
- end
9
-
10
- def valid?
11
- return false unless @hash[:positions].is_a?(Array)
12
- return false if @hash[:positions].map {|p| position_valid?(p) == false }.any?
13
-
14
- true
15
- end
16
-
17
- def position_valid?(position_hash)
18
- return false if @ids.include?(position_hash[:id])
19
- @ids.push(position_hash[:id])
20
-
21
- return false unless position_hash[:mask].is_a? Array
22
-
23
- position_hash[:mask].select {|q|
24
- !mask_valid?(q)
25
- }.empty?
26
- end
27
-
28
- def mask_valid?(position_hash)
29
- return false unless position_hash[:group].is_a?(Fixnum)
30
- return false unless position_hash[:uframe].is_a?(Fixnum)
31
- return false unless position_hash[:utool].is_a?(Fixnum)
32
-
33
- if position_hash[:config].is_a?(Hash)
34
- return false unless boolean?(position_hash[:config][:flip])
35
- return false unless boolean?(position_hash[:config][:up])
36
- return false unless boolean?(position_hash[:config][:top])
37
- return false unless position_hash[:config][:turn_counts].is_a?(Array)
38
- return false unless position_hash[:config][:turn_counts].length == 3
39
- return false if position_hash[:config][:turn_counts].map {|tc| tc.is_a?(Fixnum) == false }.any?
40
- return false unless position_hash[:components].is_a?(Hash)
41
- [:x,:y,:z,:w,:p,:r].each do |component|
42
- return false unless position_hash[:components][component].is_a?(Float)
43
- end
44
- else
45
- # must be joint representation
46
- return false unless position_hash[:components].is_a?(Hash)
47
- position_hash[:components].each do |component|
48
- return false unless component[1].is_a?(Float)
49
- end
50
- end
51
-
52
- true
53
- end
54
-
55
- def boolean?(thing)
56
- thing.is_a?(TrueClass) || thing.is_a?(FalseClass)
57
- end
58
-
59
- def eval(context, options={})
60
- raise "Invalid position data" unless valid?
61
- context.position_data = @hash
62
- nil
63
- end
64
- end
65
- end
66
- end
1
+ module TPPlus
2
+ module Nodes
3
+ class PositionDataNode < BaseNode
4
+ attr_reader :hash
5
+ def initialize(hash)
6
+ @hash = hash
7
+ @ids = []
8
+ end
9
+
10
+ def valid?
11
+ return false unless @hash[:positions].is_a?(Array)
12
+ return false if @hash[:positions].map {|p| position_valid?(p) == false }.any?
13
+
14
+ true
15
+ end
16
+
17
+ def position_valid?(position_hash)
18
+ return false if @ids.include?(position_hash[:id])
19
+ @ids.push(position_hash[:id])
20
+
21
+ return false unless position_hash[:mask].is_a? Array
22
+
23
+ position_hash[:mask].select {|q|
24
+ !mask_valid?(q)
25
+ }.empty?
26
+ end
27
+
28
+ def mask_valid?(position_hash)
29
+ return false unless position_hash[:group].is_a?(Fixnum)
30
+ return false unless position_hash[:uframe].is_a?(Fixnum)
31
+ return false unless position_hash[:utool].is_a?(Fixnum)
32
+
33
+ if position_hash[:config].is_a?(Hash)
34
+ return false unless boolean?(position_hash[:config][:flip])
35
+ return false unless boolean?(position_hash[:config][:up])
36
+ return false unless boolean?(position_hash[:config][:top])
37
+ return false unless position_hash[:config][:turn_counts].is_a?(Array)
38
+ return false unless position_hash[:config][:turn_counts].length == 3
39
+ return false if position_hash[:config][:turn_counts].map {|tc| tc.is_a?(Fixnum) == false }.any?
40
+ return false unless position_hash[:components].is_a?(Hash)
41
+ [:x,:y,:z,:w,:p,:r].each do |component|
42
+ return false unless position_hash[:components][component].is_a?(Float)
43
+ end
44
+ else
45
+ # must be joint representation
46
+ return false unless position_hash[:components].is_a?(Hash)
47
+ position_hash[:components].each do |component|
48
+ return false unless component[1].is_a?(Float)
49
+ end
50
+ end
51
+
52
+ true
53
+ end
54
+
55
+ def boolean?(thing)
56
+ thing.is_a?(TrueClass) || thing.is_a?(FalseClass)
57
+ end
58
+
59
+ def eval(context, options={})
60
+ raise "Invalid position data" unless valid?
61
+ context.position_data = @hash
62
+ nil
63
+ end
64
+ end
65
+ end
66
+ end
@@ -1,26 +1,26 @@
1
- module TPPlus
2
- module Nodes
3
- class PositionNode < BaseNode
4
- attr_accessor :comment
5
- attr_reader :id
6
- def initialize(id)
7
- @id = id
8
- @comment = ""
9
- end
10
-
11
- def requires_mixed_logic?(context)
12
- false
13
- end
14
-
15
- def comment_string
16
- return "" if @comment == ""
17
-
18
- ":#{@comment}"
19
- end
20
-
21
- def eval(context,options={})
22
- "P[#{@id}#{comment_string}]"
23
- end
24
- end
25
- end
26
- end
1
+ module TPPlus
2
+ module Nodes
3
+ class PositionNode < BaseNode
4
+ attr_accessor :comment
5
+ attr_reader :id
6
+ def initialize(id)
7
+ @id = id
8
+ @comment = ""
9
+ end
10
+
11
+ def requires_mixed_logic?(context)
12
+ false
13
+ end
14
+
15
+ def comment_string
16
+ return "" if @comment == ""
17
+
18
+ ":#{@comment}"
19
+ end
20
+
21
+ def eval(context,options={})
22
+ "P[#{@id}#{comment_string}]"
23
+ end
24
+ end
25
+ end
26
+ end
@@ -1,64 +1,64 @@
1
- module TPPlus
2
- module Nodes
3
- class PosregNode < BaseNode
4
-
5
- COMPONENTS = {
6
- "x" => 1,
7
- "y" => 2,
8
- "z" => 3,
9
- "w" => 4,
10
- "p" => 5,
11
- "r" => 6,
12
- }
13
-
14
- GROUPS = {
15
- "gp1" => "GP1",
16
- "gp2" => "GP2",
17
- "gp3" => "GP3",
18
- "gp4" => "GP4",
19
- "gp5" => "GP5"
20
- }
21
-
22
- attr_accessor :comment
23
- attr_reader :id
24
- def initialize(id)
25
- @id = id
26
- @comment = ""
27
- end
28
-
29
- def comment_string
30
- return "" if @comment == ""
31
-
32
- ":#{@comment}"
33
- end
34
-
35
- def component(m)
36
- return "" if m == ""
37
-
38
- ",#{COMPONENTS[m]}"
39
- end
40
-
41
- def component_valid?(c)
42
- [""].concat(COMPONENTS.keys).include? c
43
- end
44
-
45
- def component_groups?(c)
46
- [""].concat(GROUPS.keys).include? c
47
- end
48
-
49
- def requires_mixed_logic?(context)
50
- false
51
- end
52
-
53
- def eval(context,options={})
54
- options[:method] ||= ""
55
-
56
- group_string = GROUPS["gp" + options[:group].eval(context).to_s] + ":" if options[:group]
57
-
58
- raise "Invalid component" unless component_valid?(options[:method]) || component_groups?(options[:group])
59
-
60
- "PR[#{group_string}#{@id}#{component(options[:method])}#{comment_string}]"
61
- end
62
- end
63
- end
64
- end
1
+ module TPPlus
2
+ module Nodes
3
+ class PosregNode < BaseNode
4
+
5
+ COMPONENTS = {
6
+ "x" => 1,
7
+ "y" => 2,
8
+ "z" => 3,
9
+ "w" => 4,
10
+ "p" => 5,
11
+ "r" => 6,
12
+ }
13
+
14
+ GROUPS = {
15
+ "gp1" => "GP1",
16
+ "gp2" => "GP2",
17
+ "gp3" => "GP3",
18
+ "gp4" => "GP4",
19
+ "gp5" => "GP5"
20
+ }
21
+
22
+ attr_accessor :comment
23
+ attr_reader :id
24
+ def initialize(id)
25
+ @id = id
26
+ @comment = ""
27
+ end
28
+
29
+ def comment_string
30
+ return "" if @comment == ""
31
+
32
+ ":#{@comment}"
33
+ end
34
+
35
+ def component(m)
36
+ return "" if m == ""
37
+
38
+ ",#{COMPONENTS[m]}"
39
+ end
40
+
41
+ def component_valid?(c)
42
+ [""].concat(COMPONENTS.keys).include? c
43
+ end
44
+
45
+ def component_groups?(c)
46
+ [""].concat(GROUPS.keys).include? c
47
+ end
48
+
49
+ def requires_mixed_logic?(context)
50
+ false
51
+ end
52
+
53
+ def eval(context,options={})
54
+ options[:method] ||= ""
55
+
56
+ group_string = GROUPS["gp" + options[:group].eval(context).to_s] + ":" if options[:group]
57
+
58
+ raise "Invalid component" unless component_valid?(options[:method]) || component_groups?(options[:group])
59
+
60
+ "PR[#{group_string}#{@id}#{component(options[:method])}#{comment_string}]"
61
+ end
62
+ end
63
+ end
64
+ end
@@ -1,13 +1,13 @@
1
- module TPPlus
2
- module Nodes
3
- class RaiseNode < BaseNode
4
- def initialize(target)
5
- @target = target
6
- end
7
-
8
- def eval(context, options={})
9
- "#{@target.eval(context)}"
10
- end
11
- end
12
- end
13
- end
1
+ module TPPlus
2
+ module Nodes
3
+ class RaiseNode < BaseNode
4
+ def initialize(target)
5
+ @target = target
6
+ end
7
+
8
+ def eval(context, options={})
9
+ "#{@target.eval(context)}"
10
+ end
11
+ end
12
+ end
13
+ end
@@ -1,27 +1,27 @@
1
- module TPPlus
2
- module Nodes
3
- class RealNode < BaseNode
4
- def initialize(value)
5
- @value = value
6
- end
7
-
8
- def requires_mixed_logic?(context)
9
- false
10
- end
11
-
12
- def eval(context,options={})
13
- val = if options[:as_string]
14
- ("%.2f" % @value).sub(/^0/,'')
15
- else
16
- @value
17
- end
18
-
19
- if @value < 0
20
- "(#{val})"
21
- else
22
- val
23
- end
24
- end
25
- end
26
- end
27
- end
1
+ module TPPlus
2
+ module Nodes
3
+ class RealNode < BaseNode
4
+ def initialize(value)
5
+ @value = value
6
+ end
7
+
8
+ def requires_mixed_logic?(context)
9
+ false
10
+ end
11
+
12
+ def eval(context,options={})
13
+ val = if options[:as_string]
14
+ ("%.2f" % @value).sub(/^0/,'')
15
+ else
16
+ @value
17
+ end
18
+
19
+ if @value < 0
20
+ "(#{val})"
21
+ else
22
+ val
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -1,9 +1,9 @@
1
- module TPPlus
2
- module Nodes
3
- class ReturnNode < BaseNode
4
- def eval(context)
5
- "END"
6
- end
7
- end
8
- end
9
- end
1
+ module TPPlus
2
+ module Nodes
3
+ class ReturnNode < BaseNode
4
+ def eval(context)
5
+ "END"
6
+ end
7
+ end
8
+ end
9
+ end
@@ -1,14 +1,14 @@
1
- module TPPlus
2
- module Nodes
3
- # for setting skip conditions
4
- class SetSkipNode < BaseNode
5
- def initialize(value)
6
- @value = value
7
- end
8
-
9
- def eval(context)
10
- "SKIP CONDITION #{@value.eval(context, disable_mixed_logic: true)}"
11
- end
12
- end
13
- end
14
- end
1
+ module TPPlus
2
+ module Nodes
3
+ # for setting skip conditions
4
+ class SetSkipNode < BaseNode
5
+ def initialize(value)
6
+ @value = value
7
+ end
8
+
9
+ def eval(context)
10
+ "SKIP CONDITION #{@value.eval(context, disable_mixed_logic: true)}"
11
+ end
12
+ end
13
+ end
14
+ end
@@ -1,22 +1,22 @@
1
- module TPPlus
2
- module Nodes
3
- class SkipNode < BaseNode
4
- def initialize(target, lpos_pr)
5
- @target = target
6
- @lpos_pr = lpos_pr
7
- end
8
-
9
- def lpos_pr(context)
10
- return "" if @lpos_pr.nil?
11
-
12
- ",#{@lpos_pr.eval(context)}=LPOS"
13
- end
14
-
15
- def eval(context)
16
- raise "Label (#{@target}) not found" if context.labels[@target.to_sym].nil?
17
-
18
- "Skip,LBL[#{context.labels[@target.to_sym]}]#{lpos_pr(context)}"
19
- end
20
- end
21
- end
22
- end
1
+ module TPPlus
2
+ module Nodes
3
+ class SkipNode < BaseNode
4
+ def initialize(target, lpos_pr)
5
+ @target = target
6
+ @lpos_pr = lpos_pr
7
+ end
8
+
9
+ def lpos_pr(context)
10
+ return "" if @lpos_pr.nil?
11
+
12
+ ",#{@lpos_pr.eval(context)}=LPOS"
13
+ end
14
+
15
+ def eval(context)
16
+ raise "Label (#{@target}) not found" if context.labels[@target.to_sym].nil?
17
+
18
+ "Skip,LBL[#{context.labels[@target.to_sym]}]#{lpos_pr(context)}"
19
+ end
20
+ end
21
+ end
22
+ end
@@ -1,29 +1,29 @@
1
- module TPPlus
2
- module Nodes
3
- class SpeedNode < BaseNode
4
- def initialize(speed_hash)
5
- @speed_hash = speed_hash
6
- end
7
-
8
- def speed(context)
9
- @speed_hash[:speed].eval(context)
10
- end
11
-
12
- def units
13
- case @speed_hash[:units]
14
- when "mm/s"
15
- "mm/sec"
16
- else
17
- @speed_hash[:units]
18
- end
19
- end
20
-
21
-
22
- def eval(context)
23
- return @speed_hash[:speed] if @speed_hash[:units].nil?
24
-
25
- "#{speed(context)}#{units}"
26
- end
27
- end
28
- end
29
- end
1
+ module TPPlus
2
+ module Nodes
3
+ class SpeedNode < BaseNode
4
+ def initialize(speed_hash)
5
+ @speed_hash = speed_hash
6
+ end
7
+
8
+ def speed(context)
9
+ @speed_hash[:speed].eval(context)
10
+ end
11
+
12
+ def units
13
+ case @speed_hash[:units]
14
+ when "mm/s"
15
+ "mm/sec"
16
+ else
17
+ @speed_hash[:units]
18
+ end
19
+ end
20
+
21
+
22
+ def eval(context)
23
+ return @speed_hash[:speed] if @speed_hash[:units].nil?
24
+
25
+ "#{speed(context)}#{units}"
26
+ end
27
+ end
28
+ end
29
+ end
@@ -1,13 +1,13 @@
1
- module TPPlus
2
- module Nodes
3
- class StringNode < BaseNode
4
- def initialize(s)
5
- @s = s
6
- end
7
-
8
- def eval(context)
9
- "'#{@s}'"
10
- end
11
- end
12
- end
13
- end
1
+ module TPPlus
2
+ module Nodes
3
+ class StringNode < BaseNode
4
+ def initialize(s)
5
+ @s = s
6
+ end
7
+
8
+ def eval(context)
9
+ "'#{@s}'"
10
+ end
11
+ end
12
+ end
13
+ end
@@ -1,26 +1,26 @@
1
- module TPPlus
2
- module Nodes
3
- class StringRegisterNode < BaseNode
4
- attr_accessor :comment
5
- attr_reader :id
6
- def initialize(id)
7
- @id = id
8
- @comment = ""
9
- end
10
-
11
- def requires_mixed_logic?(context)
12
- false
13
- end
14
-
15
- def comment_string
16
- return "" if @comment == ""
17
-
18
- ":#{@comment}"
19
- end
20
-
21
- def eval(context,options={})
22
- "SR[#{@id}#{comment_string}]"
23
- end
24
- end
25
- end
26
- end
1
+ module TPPlus
2
+ module Nodes
3
+ class StringRegisterNode < BaseNode
4
+ attr_accessor :comment
5
+ attr_reader :id
6
+ def initialize(id)
7
+ @id = id
8
+ @comment = ""
9
+ end
10
+
11
+ def requires_mixed_logic?(context)
12
+ false
13
+ end
14
+
15
+ def comment_string
16
+ return "" if @comment == ""
17
+
18
+ ":#{@comment}"
19
+ end
20
+
21
+ def eval(context,options={})
22
+ "SR[#{@id}#{comment_string}]"
23
+ end
24
+ end
25
+ end
26
+ end