tp_plus 0.0.87 → 0.0.88

Sign up to get free protection for your applications and to get access to all the features.
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