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,23 +1,29 @@
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
+ module TPPlus
2
+ module Nodes
3
+ class TerminationNode < BaseNode
4
+ def initialize(value)
5
+ @value = value
6
+ end
7
+
8
+ def eval(context)
9
+ case @value
10
+ when DigitNode
11
+ "CNT#{@value.eval(context)}"
12
+ when VarNode
13
+ if @value.constant?
14
+ val = @value.eval(context)
15
+ if val[0] == "(" # negative
16
+ "FINE"
17
+ else
18
+ "CNT#{val}"
19
+ end
20
+ else
21
+ "CNT #{@value.eval(context)}"
22
+ end
23
+ else
24
+ raise "invalid term"
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -1,16 +1,16 @@
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
+ 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 < 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
+ 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,33 +1,33 @@
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
+ 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 < 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
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
@@ -1,39 +1,40 @@
1
- module TPPlus
2
- module Nodes
3
- class UnaryExpressionNode < BaseNode
4
- attr_reader :op, :x
5
- def initialize(op, x)
6
- @op = OperatorNode.new(op)
7
- @x = x
8
- end
9
-
10
- def grouped?
11
- false
12
- end
13
-
14
- def requires_mixed_logic?(context)
15
- true
16
- end
17
-
18
- def contains_expression?
19
- false
20
- end
21
-
22
- def boolean_result?
23
- false
24
- end
25
-
26
- def eval(context,options={})
27
- if options[:opposite]
28
- options[:opposite] = false #VarNode.eval() with options[:opposite] will add a !
29
- @x.eval(context, options)
30
- elsif options[:disable_mixed_logic]
31
- options[:disable_mixed_logic] = false
32
- "#{@x.eval(context, options)}=OFF"
33
- else
34
- "#{@op.eval(context, options)}#{@x.eval(context, options)}"
35
- end
36
- end
37
- end
38
- end
39
- end
1
+ module TPPlus
2
+ module Nodes
3
+ class UnaryExpressionNode < BaseNode
4
+ attr_reader :op, :x
5
+ def initialize(op, x)
6
+ @op = OperatorNode.new(op)
7
+ @x = x
8
+ end
9
+
10
+ def grouped?
11
+ false
12
+ end
13
+
14
+ def requires_mixed_logic?(context)
15
+ true
16
+ end
17
+
18
+ def contains_expression?
19
+ true
20
+ end
21
+
22
+ def boolean_result?
23
+ false
24
+ end
25
+
26
+ def eval(context,options={})
27
+ if options[:opposite]
28
+ new_options = options.dup
29
+ new_options.delete(:opposite) # VarNode.eval() with opposite will add a !
30
+ @x.eval(context, new_options)
31
+ elsif options[:disable_mixed_logic]
32
+ options[:disable_mixed_logic] = false
33
+ "#{@x.eval(context, options)}=OFF"
34
+ else
35
+ "#{@op.eval(context, options)}#{@x.eval(context, options)}"
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -1,20 +1,20 @@
1
- module TPPlus
2
- module Nodes
3
- class UnitsNode < BaseNode
4
- def initialize(s)
5
- @s = s
6
- end
7
-
8
- def eval(context)
9
- case @s
10
- when "mm/s"
11
- "mm/sec"
12
- when "%"
13
- "%"
14
- else
15
- raise "Unknown unit: #{@s}"
16
- end
17
- end
18
- end
19
- end
20
- end
1
+ module TPPlus
2
+ module Nodes
3
+ class UnitsNode < BaseNode
4
+ def initialize(s)
5
+ @s = s
6
+ end
7
+
8
+ def eval(context)
9
+ case @s
10
+ when "mm/s"
11
+ "mm/sec"
12
+ when "%"
13
+ "%"
14
+ else
15
+ raise "Unknown unit: #{@s}"
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -1,21 +1,21 @@
1
- module TPPlus
2
- module Nodes
3
- class UseNode < BaseNode
4
- def initialize(type, value)
5
- @type = type
6
- @value = value
7
- end
8
-
9
- def eval(context)
10
- case @type
11
- when "use_uframe"
12
- "UFRAME_NUM=#{@value.eval(context)}"
13
- when "use_utool"
14
- "UTOOL_NUM=#{@value.eval(context)}"
15
- when "use_payload"
16
- "PAYLOAD[#{@value.eval(context)}]"
17
- end
18
- end
19
- end
20
- end
21
- end
1
+ module TPPlus
2
+ module Nodes
3
+ class UseNode < BaseNode
4
+ def initialize(type, value)
5
+ @type = type
6
+ @value = value
7
+ end
8
+
9
+ def eval(context)
10
+ case @type
11
+ when "use_uframe"
12
+ "UFRAME_NUM=#{@value.eval(context)}"
13
+ when "use_utool"
14
+ "UTOOL_NUM=#{@value.eval(context)}"
15
+ when "use_payload"
16
+ "PAYLOAD[#{@value.eval(context)}]"
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -1,16 +1,16 @@
1
- module TPPlus
2
- module Nodes
3
- class UserAlarmNode < 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
- "UALM[#{@id}]"
13
- end
14
- end
15
- end
16
- end
1
+ module TPPlus
2
+ module Nodes
3
+ class UserAlarmNode < 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
+ "UALM[#{@id}]"
13
+ end
14
+ end
15
+ end
16
+ end
@@ -1,23 +1,23 @@
1
- module TPPlus
2
- module Nodes
3
- class VarMethodNode < BaseNode
4
- attr_reader :identifier
5
- def initialize(identifier, method)
6
- @identifier = identifier
7
- @method = method || {}
8
- end
9
-
10
- def requires_mixed_logic?(context)
11
- node(context).requires_mixed_logic?(context)
12
- end
13
-
14
- def node(context)
15
- context.get_var(@identifier)
16
- end
17
-
18
- def eval(context,options={})
19
- node(context).eval(context,options.merge(@method))
20
- end
21
- end
22
- end
23
- end
1
+ module TPPlus
2
+ module Nodes
3
+ class VarMethodNode < BaseNode
4
+ attr_reader :identifier
5
+ def initialize(identifier, method)
6
+ @identifier = identifier
7
+ @method = method || {}
8
+ end
9
+
10
+ def requires_mixed_logic?(context)
11
+ node(context).requires_mixed_logic?(context)
12
+ end
13
+
14
+ def node(context)
15
+ context.get_var(@identifier)
16
+ end
17
+
18
+ def eval(context,options={})
19
+ node(context).eval(context,options.merge(@method))
20
+ end
21
+ end
22
+ end
23
+ end
@@ -1,39 +1,39 @@
1
- module TPPlus
2
- module Nodes
3
- class VarNode < BaseNode
4
- attr_reader :identifier
5
- def initialize(identifier)
6
- @identifier = identifier
7
- end
8
-
9
- def target_node(context)
10
- constant? ? context.get_constant(@identifier) : context.get_var(@identifier)
11
- end
12
-
13
- def constant?
14
- @identifier.upcase == @identifier
15
- end
16
-
17
- def requires_mixed_logic?(context)
18
- target_node(context).requires_mixed_logic?(context)
19
- end
20
-
21
- def with_parens(s, options)
22
- return s unless options[:as_condition]
23
-
24
- "(#{s})"
25
- end
26
-
27
- def eval(context,options={})
28
- return target_node(context).eval(context) if constant?
29
-
30
- s = ""
31
- if options[:opposite]
32
- s += "!"
33
- end
34
-
35
- with_parens(s + target_node(context).eval(context, options), options)
36
- end
37
- end
38
- end
39
- end
1
+ module TPPlus
2
+ module Nodes
3
+ class VarNode < BaseNode
4
+ attr_reader :identifier
5
+ def initialize(identifier)
6
+ @identifier = identifier
7
+ end
8
+
9
+ def target_node(context)
10
+ constant? ? context.get_constant(@identifier) : context.get_var(@identifier)
11
+ end
12
+
13
+ def constant?
14
+ @identifier.upcase == @identifier
15
+ end
16
+
17
+ def requires_mixed_logic?(context)
18
+ target_node(context).requires_mixed_logic?(context)
19
+ end
20
+
21
+ def with_parens(s, options)
22
+ return s unless options[:as_condition]
23
+
24
+ "(#{s})"
25
+ end
26
+
27
+ def eval(context,options={})
28
+ return target_node(context).eval(context) if constant?
29
+
30
+ s = ""
31
+ if options[:opposite]
32
+ s += "!"
33
+ end
34
+
35
+ with_parens(s + target_node(context).eval(context, options), options)
36
+ end
37
+ end
38
+ end
39
+ end
@@ -1,22 +1,22 @@
1
- module TPPlus
2
- module Nodes
3
- class VisionRegisterNode < BaseNode
4
- attr_accessor :comment
5
- attr_reader :id
6
- def initialize(id)
7
- @id = id
8
- @comment = ""
9
- end
10
-
11
- def comment_string
12
- return "" if @comment == ""
13
-
14
- ":#{@comment}"
15
- end
16
-
17
- def eval(context,options={})
18
- "VR[#{@id}#{comment_string}]"
19
- end
20
- end
21
- end
22
- end
1
+ module TPPlus
2
+ module Nodes
3
+ class VisionRegisterNode < BaseNode
4
+ attr_accessor :comment
5
+ attr_reader :id
6
+ def initialize(id)
7
+ @id = id
8
+ @comment = ""
9
+ end
10
+
11
+ def comment_string
12
+ return "" if @comment == ""
13
+
14
+ ":#{@comment}"
15
+ end
16
+
17
+ def eval(context,options={})
18
+ "VR[#{@id}#{comment_string}]"
19
+ end
20
+ end
21
+ end
22
+ end