tp_plus 0.0.77 → 0.0.87

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 -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