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