tp_plus 0.0.77 → 0.0.87

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 -84
  3. data/Rakefile +35 -35
  4. data/bin/tpp +92 -92
  5. data/lib/tp_plus/interpreter.rb +152 -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 +19 -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 -45
  12. data/lib/tp_plus/nodes/base_node.rb +9 -0
  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 -22
  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 +68 -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 -51
  26. data/lib/tp_plus/nodes/inline_conditional_node.rb +36 -40
  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 -0
  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 -0
  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 +80 -78
  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 -0
  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 +23 -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 -37
  56. data/lib/tp_plus/nodes/timer_node.rb +16 -16
  57. data/lib/tp_plus/nodes/unary_expression_node.rb +39 -0
  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 +50 -54
  65. data/lib/tp_plus/nodes/wait_until_node.rb +61 -65
  66. data/lib/tp_plus/nodes/while_node.rb +40 -42
  67. data/lib/tp_plus/parser.rb +1749 -1697
  68. data/lib/tp_plus/scanner.rb +295 -295
  69. data/lib/tp_plus/token.rb +101 -98
  70. data/lib/tp_plus/version.rb +3 -3
  71. data/lib/tp_plus.rb +72 -67
  72. data/test/test_helper.rb +5 -5
  73. data/test/tp_plus/test_interpreter.rb +1372 -1329
  74. data/test/tp_plus/test_parser.rb +502 -502
  75. data/test/tp_plus/test_scanner.rb +591 -577
  76. data/tp_plus.gemspec +31 -31
  77. metadata +8 -3
@@ -1,64 +1,64 @@
1
- module TPPlus
2
- module Nodes
3
- class PosregNode
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
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
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
@@ -0,0 +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,14 +1,14 @@
1
- module TPPlus
2
- module Nodes
3
- # for setting skip conditions
4
- class SetSkipNode
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
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
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
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
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
@@ -1,23 +1,23 @@
1
- module TPPlus
2
- module Nodes
3
- class TerminationNode
4
- def initialize(value)
5
- @value = value
6
- end
7
-
8
- def eval(context)
9
- val = @value.eval(context)
10
- case val
11
- when Integer
12
- "CNT#{val}"
13
- else
14
- if val[0] == "R"
15
- "CNT #{val}"
16
- else
17
- "FINE"
18
- end
19
- end
20
- end
21
- end
22
- end
23
- end
1
+ module TPPlus
2
+ module Nodes
3
+ class TerminationNode < BaseNode
4
+ def initialize(value)
5
+ @value = value
6
+ end
7
+
8
+ def eval(context)
9
+ val = @value.eval(context)
10
+ case val
11
+ when Integer
12
+ "CNT#{val}"
13
+ else
14
+ if val[0] == "R"
15
+ "CNT #{val}"
16
+ else
17
+ "FINE"
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -1,16 +1,16 @@
1
- module TPPlus
2
- module Nodes
3
- class TerminatorNode
4
- def eval(context)
5
- nil
6
- end
7
- end
8
- end
9
- end
10
-
11
- # IF R[1:foo]<>1,JMP LBL[100] ;
12
- # R[1:foo]=2 ;
13
- # JMP LBL[101] ;
14
- # LBL[100] ;
15
- # R[1:foo]=1 ;
16
- # LBL[101] ;
1
+ module TPPlus
2
+ module Nodes
3
+ class TerminatorNode < BaseNode
4
+ def eval(context)
5
+ nil
6
+ end
7
+ end
8
+ end
9
+ end
10
+
11
+ # IF R[1:foo]<>1,JMP LBL[100] ;
12
+ # R[1:foo]=2 ;
13
+ # JMP LBL[101] ;
14
+ # LBL[100] ;
15
+ # R[1:foo]=1 ;
16
+ # LBL[101] ;
@@ -1,24 +1,24 @@
1
- module TPPlus
2
- module Nodes
3
- class TimeNode
4
- def initialize(type, time, action)
5
- @type = type
6
- @time = time
7
- @action = action
8
- end
9
-
10
- def type
11
- case @type.downcase
12
- when "time_before"
13
- "TB"
14
- when "time_after"
15
- "TA"
16
- end
17
- end
18
-
19
- def eval(context)
20
- "#{type} #{@time.eval(context,as_string: true)}sec,#{@action.eval(context)}"
21
- end
22
- end
23
- end
24
- end
1
+ module TPPlus
2
+ module Nodes
3
+ class TimeNode < BaseNode
4
+ def initialize(type, time, action)
5
+ @type = type
6
+ @time = time
7
+ @action = action
8
+ end
9
+
10
+ def type
11
+ case @type.downcase
12
+ when "time_before"
13
+ "TB"
14
+ when "time_after"
15
+ "TA"
16
+ end
17
+ end
18
+
19
+ def eval(context)
20
+ "#{type} #{@time.eval(context,as_string: true)}sec,#{@action.eval(context)}"
21
+ end
22
+ end
23
+ end
24
+ end
@@ -1,37 +1,33 @@
1
- module TPPlus
2
- module Nodes
3
- class TimerMethodNode
4
- def initialize(method, target)
5
- @method = method
6
- @target = target
7
- end
8
-
9
- def requires_mixed_logic?(context)
10
- true
11
- end
12
-
13
- def can_be_inlined?
14
- false
15
- end
16
-
17
- def timer(context)
18
- @timer ||= @target.eval(context)
19
- end
20
-
21
- def eval(context,options={})
22
- case @method
23
- when "start"
24
- "#{timer(context)}=START"
25
- when "stop"
26
- "#{timer(context)}=STOP"
27
- when "reset"
28
- "#{timer(context)}=RESET"
29
- when "restart"
30
- "#{timer(context)}=STOP ;\n#{timer(context)}=RESET ;\n#{timer(context)}=START"
31
- else
32
- raise "Invalid timer method (#{@method})"
33
- end
34
- end
35
- end
36
- end
37
- end
1
+ module TPPlus
2
+ module Nodes
3
+ class TimerMethodNode < BaseNode
4
+ def initialize(method, target)
5
+ @method = method
6
+ @target = target
7
+ end
8
+
9
+ def requires_mixed_logic?(context)
10
+ true
11
+ end
12
+
13
+ def timer(context)
14
+ @timer ||= @target.eval(context)
15
+ end
16
+
17
+ def eval(context,options={})
18
+ case @method
19
+ when "start"
20
+ "#{timer(context)}=START"
21
+ when "stop"
22
+ "#{timer(context)}=STOP"
23
+ when "reset"
24
+ "#{timer(context)}=RESET"
25
+ when "restart"
26
+ "#{timer(context)}=STOP ;\n#{timer(context)}=RESET ;\n#{timer(context)}=START"
27
+ else
28
+ raise "Invalid timer method (#{@method})"
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -1,16 +1,16 @@
1
- module TPPlus
2
- module Nodes
3
- class TimerNode
4
- attr_accessor :comment
5
- attr_reader :id
6
- def initialize(id)
7
- @id = id
8
- @comment = ""
9
- end
10
-
11
- def eval(context, options={})
12
- "TIMER[#{@id}]" # FANUC does not like timer comments
13
- end
14
- end
15
- end
16
- end
1
+ module TPPlus
2
+ module Nodes
3
+ class TimerNode < BaseNode
4
+ attr_accessor :comment
5
+ attr_reader :id
6
+ def initialize(id)
7
+ @id = id
8
+ @comment = ""
9
+ end
10
+
11
+ def eval(context, options={})
12
+ "TIMER[#{@id}]" # FANUC does not like timer comments
13
+ end
14
+ end
15
+ end
16
+ end