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,68 +1,71 @@
1
- module TPPlus
2
- module Nodes
3
- class ExpressionNode < BaseNode
4
- attr_reader :left_op, :op, :right_op
5
- def initialize(left_op, op_string, right_op)
6
- @left_op = left_op
7
- @op = OperatorNode.new(op_string)
8
- @right_op = right_op
9
- end
10
-
11
- def grouped?
12
- return false if @right_op.nil? # this is for NOT (!) operator
13
-
14
- @left_op.is_a?(ParenExpressionNode) || @right_op.is_a?(ParenExpressionNode)
15
- end
16
-
17
- def requires_mixed_logic?(context)
18
- contains_expression? ||
19
- grouped? ||
20
- [@op, @left_op, @right_op].map { |op|
21
- next if op.nil?
22
- op.requires_mixed_logic?(context)
23
- }.any?
24
- end
25
-
26
- def contains_expression?
27
- [@left_op, @right_op].map {|op| op.is_a? ExpressionNode }.any? ||
28
- [@left_op, @right_op].map { |op| op.is_a? ParenExpressionNode }.any?
29
- end
30
-
31
- def boolean_result?
32
- case @op.string
33
- when "&&","||","!","==","<>",">",">=","<","<="
34
- true
35
- else
36
- false
37
- end
38
- end
39
-
40
- def string_val(context, options={})
41
- if @op.bang?
42
- # this is for skip conditions, which do not
43
- # support mixed logic
44
- if options[:disable_mixed_logic]
45
- "#{@left_op.eval(context)}=OFF"
46
- else
47
- "#{@op.eval(context,options)}#{@left_op.eval(context)}"
48
- end
49
- else
50
- if @op.boolean?
51
- # if operator is &&, || or !, we flip the operator and the operands
52
- "#{@left_op.eval(context,options)}#{@op.eval(context, options)}#{@right_op.eval(context, options)}"
53
- else
54
- # flip the operator if options[:opposite]
55
- # flip the operands only if opposite and the operand is an expression
56
- "#{@left_op.eval(context, opposite: (@left_op.is_a?(ExpressionNode) && options[:opposite]))}#{@op.eval(context, options)}#{@right_op.eval(context, opposite: (@right_op.is_a?(ExpressionNode) && options[:opposite]))}"
57
- end
58
- end
59
- end
60
-
61
- def eval(context,options={})
62
- options[:force_parens] = true if grouped?
63
-
64
- string_val(context, options)
65
- end
66
- end
67
- end
68
- end
1
+ module TPPlus
2
+ module Nodes
3
+ class ExpressionNode < BaseNode
4
+ attr_reader :left_op, :op, :right_op
5
+ def initialize(left_op, op_string, right_op)
6
+ @left_op = left_op
7
+ @op = OperatorNode.new(op_string)
8
+ @right_op = right_op
9
+ end
10
+
11
+ def grouped?
12
+ return false if @right_op.nil? # this is for NOT (!) operator
13
+
14
+ @left_op.is_a?(ParenExpressionNode) || @right_op.is_a?(ParenExpressionNode)
15
+ end
16
+
17
+ def requires_mixed_logic?(context)
18
+ contains_expression? ||
19
+ grouped? ||
20
+ [@op, @left_op, @right_op].map { |op|
21
+ next if op.nil?
22
+ op.requires_mixed_logic?(context)
23
+ }.any?
24
+ end
25
+
26
+ def contains_expression?
27
+ [@left_op, @right_op].map {|op| op.is_a? ExpressionNode }.any? ||
28
+ [@left_op, @right_op].map { |op| op.is_a? ParenExpressionNode }.any?
29
+ end
30
+
31
+ def boolean_result?
32
+ case @op.string
33
+ when "&&","||","!","==","<>",">",">=","<","<="
34
+ true
35
+ else
36
+ false
37
+ end
38
+ end
39
+
40
+ def string_val(context, options={})
41
+ if @op.bang?
42
+ # this is for skip conditions, which do not
43
+ # support mixed logic
44
+ if options[:disable_mixed_logic]
45
+ "#{@left_op.eval(context)}=OFF"
46
+ else
47
+ "#{@op.eval(context,options)}#{@left_op.eval(context)}"
48
+ end
49
+ else
50
+ if @op.boolean?
51
+ # if operator is &&, || or !, we flip the operator and the operands
52
+ left = @left_op.eval(context, options)
53
+ op = @op.eval(context, options)
54
+ right = @right_op.eval(context, options)
55
+ [left, op, right].reject(&:empty?).join('')
56
+ else
57
+ # flip the operator if options[:opposite]
58
+ # flip the operands only if opposite and the operand is an expression
59
+ "#{@left_op.eval(context, opposite: ((@left_op.is_a?(ExpressionNode) || @left_op.is_a?(UnaryExpressionNode))&& options[:opposite]))}#{@op.eval(context, options)}#{@right_op.eval(context, opposite: ((@right_op.is_a?(ExpressionNode) || @right_op.is_a?(UnaryExpressionNode)) && options[:opposite]))}"
60
+ end
61
+ end
62
+ end
63
+
64
+ def eval(context,options={})
65
+ options[:force_parens] = true if grouped?
66
+
67
+ string_val(context, options)
68
+ end
69
+ end
70
+ end
71
+ end
@@ -1,20 +1,20 @@
1
- module TPPlus
2
- module Nodes
3
- class ForNode < BaseNode
4
- def initialize(var_node, initial_value_node, final_value_node, block)
5
- @var_node = var_node
6
- @initial_value_node = initial_value_node
7
- @final_value_node = final_value_node
8
- @block = block.flatten.reject {|n| n.is_a?(TerminatorNode) }
9
- end
10
-
11
- def block(context)
12
- @s ||= @block.inject("") {|s,n| s << "#{n.eval(context)} ;\n" }
13
- end
14
-
15
- def eval(context)
16
- "FOR #{@var_node.eval(context)}=#{@initial_value_node.eval(context)} TO #{@final_value_node.eval(context)} ;\n#{block(context)}ENDFOR"
17
- end
18
- end
19
- end
20
- end
1
+ module TPPlus
2
+ module Nodes
3
+ class ForNode < BaseNode
4
+ def initialize(var_node, initial_value_node, final_value_node, block)
5
+ @var_node = var_node
6
+ @initial_value_node = initial_value_node
7
+ @final_value_node = final_value_node
8
+ @block = block.flatten.reject {|n| n.is_a?(TerminatorNode) }
9
+ end
10
+
11
+ def block(context)
12
+ @s ||= @block.inject("") {|s,n| s << "#{n.eval(context)} ;\n" }
13
+ end
14
+
15
+ def eval(context)
16
+ "FOR #{@var_node.eval(context)}=#{@initial_value_node.eval(context)} TO #{@final_value_node.eval(context)} ;\n#{block(context)}ENDFOR"
17
+ end
18
+ end
19
+ end
20
+ end
@@ -1,27 +1,27 @@
1
- module TPPlus
2
- module Nodes
3
- class HeaderNode < BaseNode
4
- def initialize(type, value)
5
- @type = type
6
- @value = value
7
- end
8
-
9
- def eval(context, options={})
10
- case @type
11
- when "TP_IGNORE_PAUSE"
12
- context.header_data[:ignore_pause] = @value
13
- when "TP_COMMENT"
14
- context.header_data[:comment] = @value
15
- when "TP_GROUPMASK"
16
- context.header_data[:group_mask] = @value
17
- when "TP_SUBTYPE"
18
- context.header_data[:subtype] = @value.to_sym
19
- else
20
- raise "Unsupported TP Header value (#{@type})"
21
- end
22
-
23
- nil
24
- end
25
- end
26
- end
27
- end
1
+ module TPPlus
2
+ module Nodes
3
+ class HeaderNode < BaseNode
4
+ def initialize(type, value)
5
+ @type = type
6
+ @value = value
7
+ end
8
+
9
+ def eval(context, options={})
10
+ case @type
11
+ when "TP_IGNORE_PAUSE"
12
+ context.header_data[:ignore_pause] = @value
13
+ when "TP_COMMENT"
14
+ context.header_data[:comment] = @value
15
+ when "TP_GROUPMASK"
16
+ context.header_data[:group_mask] = @value
17
+ when "TP_SUBTYPE"
18
+ context.header_data[:subtype] = @value.to_sym
19
+ else
20
+ raise "Unsupported TP Header value (#{@type})"
21
+ end
22
+
23
+ nil
24
+ end
25
+ end
26
+ end
27
+ end
@@ -1,27 +1,27 @@
1
- module TPPlus
2
- module Nodes
3
- class IndirectNode < BaseNode
4
- def initialize(type, target)
5
- @type = type
6
- @target = target
7
- end
8
-
9
- def requires_mixed_logic?(context)
10
- return true if @type == :f
11
-
12
- false
13
- end
14
-
15
- def eval(context,options={})
16
- s = "#{@type.upcase}[#{@target.eval(context)}]"
17
- if options[:opposite]
18
- s = "!#{s}"
19
- end
20
- if options[:as_condition]
21
- s = "(#{s})"
22
- end
23
- s
24
- end
25
- end
26
- end
27
- end
1
+ module TPPlus
2
+ module Nodes
3
+ class IndirectNode < BaseNode
4
+ def initialize(type, target)
5
+ @type = type
6
+ @target = target
7
+ end
8
+
9
+ def requires_mixed_logic?(context)
10
+ return true if @type == :f
11
+
12
+ false
13
+ end
14
+
15
+ def eval(context,options={})
16
+ s = "#{@type.upcase}[#{@target.eval(context)}]"
17
+ if options[:opposite]
18
+ s = "!#{s}"
19
+ end
20
+ if options[:as_condition]
21
+ s = "(#{s})"
22
+ end
23
+ s
24
+ end
25
+ end
26
+ end
27
+ end
@@ -1,36 +1,36 @@
1
- module TPPlus
2
- module Nodes
3
- class InlineConditionalNode < BaseNode
4
- attr_reader :condition_node
5
- def initialize(type, condition, block)
6
- @type = type
7
- @condition_node = condition
8
- @block = block
9
- end
10
-
11
- def condition_requires_mixed_logic?(context)
12
- @condition_node.is_a?(VarNode) ||
13
- @condition_node.is_a?(NamespacedVarNode) ||
14
- @condition_node.requires_mixed_logic?(context)
15
- end
16
-
17
- def block_requires_mixed_logic?(context)
18
- @block.requires_mixed_logic?(context)
19
- end
20
-
21
- def condition(context,options={})
22
- options[:opposite] ||= @type == "unless"
23
-
24
- if condition_requires_mixed_logic?(context) || block_requires_mixed_logic?(context)
25
- "(#{@condition_node.eval(context, options)})"
26
- else
27
- @condition_node.eval(context, options)
28
- end
29
- end
30
-
31
- def eval(context)
32
- "IF #{condition(context)},#{@block.eval(context,mixed_logic:true)}"
33
- end
34
- end
35
- end
36
- end
1
+ module TPPlus
2
+ module Nodes
3
+ class InlineConditionalNode < BaseNode
4
+ attr_reader :condition_node
5
+ def initialize(type, condition, block)
6
+ @type = type
7
+ @condition_node = condition
8
+ @block = block
9
+ end
10
+
11
+ def condition_requires_mixed_logic?(context)
12
+ @condition_node.is_a?(VarNode) ||
13
+ @condition_node.is_a?(NamespacedVarNode) ||
14
+ @condition_node.requires_mixed_logic?(context)
15
+ end
16
+
17
+ def block_requires_mixed_logic?(context)
18
+ @block.requires_mixed_logic?(context)
19
+ end
20
+
21
+ def condition(context,options={})
22
+ options[:opposite] ||= @type == "unless"
23
+
24
+ if condition_requires_mixed_logic?(context) || block_requires_mixed_logic?(context)
25
+ "(#{@condition_node.eval(context, options)})"
26
+ else
27
+ @condition_node.eval(context, options)
28
+ end
29
+ end
30
+
31
+ def eval(context)
32
+ "IF #{condition(context)},#{@block.eval(context,mixed_logic:true)}"
33
+ end
34
+ end
35
+ end
36
+ end
@@ -1,55 +1,55 @@
1
- module TPPlus
2
- module Nodes
3
- class IOMethodNode < BaseNode
4
- def initialize(method, target,options={})
5
- @method = method
6
- @target = target
7
- @init_options = options
8
- end
9
-
10
- def requires_mixed_logic?(context)
11
- true
12
- end
13
-
14
- def can_be_inlined?
15
- true
16
- end
17
-
18
- def on_off(value,options={})
19
- options[:mixed_logic] ? "(#{value})" : value
20
- end
21
-
22
- def pulse_time(context)
23
- "%.1f" % case @init_options[:pulse_units]
24
- when "s"
25
- @init_options[:pulse_time].eval(context)
26
- when "ms"
27
- @init_options[:pulse_time].eval(context).to_f / 1000
28
- else
29
- raise "Invalid pulse units"
30
- end
31
- end
32
-
33
- def pulse_extra(context)
34
- return "" if @init_options[:pulse_time].nil?
35
-
36
- ",#{pulse_time(context)}sec"
37
- end
38
-
39
- def eval(context,options={})
40
- options[:mixed_logic] = true if @target.requires_mixed_logic?(context)
41
-
42
- case @method
43
- when "turn_on"
44
- "#{@target.eval(context)}=#{on_off("ON",options)}"
45
- when "turn_off"
46
- "#{@target.eval(context)}=#{on_off("OFF",options)}"
47
- when "toggle"
48
- "#{@target.eval(context)}=(!#{@target.eval(context)})"
49
- when "pulse"
50
- "#{@target.eval(context)}=PULSE#{pulse_extra(context)}"
51
- end
52
- end
53
- end
54
- end
55
- end
1
+ module TPPlus
2
+ module Nodes
3
+ class IOMethodNode < BaseNode
4
+ def initialize(method, target,options={})
5
+ @method = method
6
+ @target = target
7
+ @init_options = options
8
+ end
9
+
10
+ def requires_mixed_logic?(context)
11
+ true
12
+ end
13
+
14
+ def can_be_inlined?
15
+ true
16
+ end
17
+
18
+ def on_off(value,options={})
19
+ options[:mixed_logic] ? "(#{value})" : value
20
+ end
21
+
22
+ def pulse_time(context)
23
+ "%.1f" % case @init_options[:pulse_units]
24
+ when "s"
25
+ @init_options[:pulse_time].eval(context)
26
+ when "ms"
27
+ @init_options[:pulse_time].eval(context).to_f / 1000
28
+ else
29
+ raise "Invalid pulse units"
30
+ end
31
+ end
32
+
33
+ def pulse_extra(context)
34
+ return "" if @init_options[:pulse_time].nil?
35
+
36
+ ",#{pulse_time(context)}sec"
37
+ end
38
+
39
+ def eval(context,options={})
40
+ options[:mixed_logic] = true if @target.requires_mixed_logic?(context)
41
+
42
+ case @method
43
+ when "turn_on"
44
+ "#{@target.eval(context)}=#{on_off("ON",options)}"
45
+ when "turn_off"
46
+ "#{@target.eval(context)}=#{on_off("OFF",options)}"
47
+ when "toggle"
48
+ "#{@target.eval(context)}=(!#{@target.eval(context)})"
49
+ when "pulse"
50
+ "#{@target.eval(context)}=PULSE#{pulse_extra(context)}"
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
@@ -1,31 +1,31 @@
1
- module TPPlus
2
- module Nodes
3
- class IONode < BaseNode
4
- attr_accessor :comment
5
- attr_reader :id
6
- def initialize(type, id)
7
- @type = type
8
- @id = id.to_i
9
- @comment = ""
10
- end
11
-
12
- def requires_mixed_logic?(context)
13
- ["F","SO","SI","DI"].include?(@type) ? true : false
14
- end
15
-
16
- def result
17
- "#{@type}[#{@id}:#{@comment}]"
18
- end
19
-
20
- def eval(context, options={})
21
- s = result
22
-
23
- if options[:disable_mixed_logic]
24
- s = "#{s}=ON"
25
- end
26
-
27
- options[:force_parens] ? "(#{s})" : s
28
- end
29
- end
30
- end
31
- end
1
+ module TPPlus
2
+ module Nodes
3
+ class IONode < BaseNode
4
+ attr_accessor :comment
5
+ attr_reader :id
6
+ def initialize(type, id)
7
+ @type = type
8
+ @id = id.to_i
9
+ @comment = ""
10
+ end
11
+
12
+ def requires_mixed_logic?(context)
13
+ ["F","SO","SI","DI"].include?(@type) ? true : false
14
+ end
15
+
16
+ def result
17
+ "#{@type}[#{@id}:#{@comment}]"
18
+ end
19
+
20
+ def eval(context, options={})
21
+ s = result
22
+
23
+ if options[:disable_mixed_logic]
24
+ s = "#{s}=ON"
25
+ end
26
+
27
+ options[:force_parens] ? "(#{s})" : s
28
+ end
29
+ end
30
+ end
31
+ end
@@ -1,13 +1,13 @@
1
- module TPPlus
2
- module Nodes
3
- class JPOSNode
4
- def initialize(var)
5
- @var = var
6
- end
7
-
8
- def eval(context, options={})
9
- "#{@var.eval(context, options)}=JPOS"
10
- end
11
- end
12
- end
13
- end
1
+ module TPPlus
2
+ module Nodes
3
+ class JPOSNode
4
+ def initialize(var)
5
+ @var = var
6
+ end
7
+
8
+ def eval(context, options={})
9
+ "#{@var.eval(context, options)}=JPOS"
10
+ end
11
+ end
12
+ end
13
+ end
@@ -1,23 +1,23 @@
1
- module TPPlus
2
- module Nodes
3
- class JumpNode < BaseNode
4
- def initialize(identifier)
5
- @identifier = identifier
6
- end
7
-
8
- def requires_mixed_logic?(context)
9
- false
10
- end
11
-
12
- def can_be_inlined?
13
- true
14
- end
15
-
16
- def eval(context,options={})
17
- raise "Label (#{@identifier}) not found" if context.labels[@identifier.to_sym].nil?
18
-
19
- "JMP LBL[#{context.labels[@identifier.to_sym]}]"
20
- end
21
- end
22
- end
23
- end
1
+ module TPPlus
2
+ module Nodes
3
+ class JumpNode < BaseNode
4
+ def initialize(identifier)
5
+ @identifier = identifier
6
+ end
7
+
8
+ def requires_mixed_logic?(context)
9
+ false
10
+ end
11
+
12
+ def can_be_inlined?
13
+ true
14
+ end
15
+
16
+ def eval(context,options={})
17
+ raise "Label (#{@identifier}) not found" if context.labels[@identifier.to_sym].nil?
18
+
19
+ "JMP LBL[#{context.labels[@identifier.to_sym]}]"
20
+ end
21
+ end
22
+ end
23
+ end
@@ -1,21 +1,21 @@
1
- module TPPlus
2
- module Nodes
3
- class LabelDefinitionNode < BaseNode
4
- attr_reader :identifier
5
- def initialize(identifier)
6
- @identifier = identifier
7
- end
8
-
9
- def long_identifier_comment(context)
10
- return "" unless @identifier.length > 16
11
-
12
- " ;\n! #{@identifier}"
13
- end
14
-
15
- def eval(context)
16
- #context.add_label(@identifier)
17
- "LBL[#{context.labels[@identifier.to_sym]}:#{@identifier[0,16]}]#{long_identifier_comment(context)}"
18
- end
19
- end
20
- end
21
- end
1
+ module TPPlus
2
+ module Nodes
3
+ class LabelDefinitionNode < BaseNode
4
+ attr_reader :identifier
5
+ def initialize(identifier)
6
+ @identifier = identifier
7
+ end
8
+
9
+ def long_identifier_comment(context)
10
+ return "" unless @identifier.length > 16
11
+
12
+ " ;\n! #{@identifier}"
13
+ end
14
+
15
+ def eval(context)
16
+ #context.add_label(@identifier)
17
+ "LBL[#{context.labels[@identifier.to_sym]}:#{@identifier[0,16]}]#{long_identifier_comment(context)}"
18
+ end
19
+ end
20
+ end
21
+ end