tp_plus 0.0.73 → 0.0.74

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 (72) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +74 -65
  3. data/Rakefile +35 -21
  4. data/bin/tpp +73 -73
  5. data/lib/tp_plus/interpreter.rb +152 -129
  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/address_node.rb +22 -0
  9. data/lib/tp_plus/nodes/argument_node.rb +20 -19
  10. data/lib/tp_plus/nodes/assignment_node.rb +45 -45
  11. data/lib/tp_plus/nodes/call_node.rb +34 -34
  12. data/lib/tp_plus/nodes/case_condition_node.rb +26 -26
  13. data/lib/tp_plus/nodes/case_node.rb +33 -33
  14. data/lib/tp_plus/nodes/comment_node.rb +22 -22
  15. data/lib/tp_plus/nodes/conditional_node.rb +60 -54
  16. data/lib/tp_plus/nodes/definition_node.rb +22 -22
  17. data/lib/tp_plus/nodes/digit_node.rb +22 -21
  18. data/lib/tp_plus/nodes/empty_stmt_node.rb +9 -0
  19. data/lib/tp_plus/nodes/eval_node.rb +13 -13
  20. data/lib/tp_plus/nodes/expression_node.rb +68 -65
  21. data/lib/tp_plus/nodes/for_node.rb +20 -20
  22. data/lib/tp_plus/nodes/header_node.rb +27 -27
  23. data/lib/tp_plus/nodes/indirect_node.rb +51 -49
  24. data/lib/tp_plus/nodes/inline_conditional_node.rb +40 -40
  25. data/lib/tp_plus/nodes/io_method_node.rb +55 -55
  26. data/lib/tp_plus/nodes/io_node.rb +31 -30
  27. data/lib/tp_plus/nodes/jump_node.rb +23 -23
  28. data/lib/tp_plus/nodes/label_definition_node.rb +21 -21
  29. data/lib/tp_plus/nodes/motion_node.rb +62 -62
  30. data/lib/tp_plus/nodes/namespace_node.rb +16 -16
  31. data/lib/tp_plus/nodes/namespaced_var_node.rb +38 -38
  32. data/lib/tp_plus/nodes/numreg_node.rb +26 -25
  33. data/lib/tp_plus/nodes/offset_node.rb +27 -27
  34. data/lib/tp_plus/nodes/operator_node.rb +78 -72
  35. data/lib/tp_plus/nodes/paren_expression_node.rb +17 -0
  36. data/lib/tp_plus/nodes/pause_node.rb +9 -9
  37. data/lib/tp_plus/nodes/position_data_node.rb +64 -50
  38. data/lib/tp_plus/nodes/position_node.rb +26 -25
  39. data/lib/tp_plus/nodes/posreg_node.rb +64 -48
  40. data/lib/tp_plus/nodes/raise_node.rb +13 -13
  41. data/lib/tp_plus/nodes/real_node.rb +27 -27
  42. data/lib/tp_plus/nodes/set_skip_node.rb +14 -0
  43. data/lib/tp_plus/nodes/skip_node.rb +22 -22
  44. data/lib/tp_plus/nodes/speed_node.rb +29 -29
  45. data/lib/tp_plus/nodes/string_node.rb +13 -13
  46. data/lib/tp_plus/nodes/string_register_node.rb +26 -25
  47. data/lib/tp_plus/nodes/termination_node.rb +23 -18
  48. data/lib/tp_plus/nodes/terminator_node.rb +16 -16
  49. data/lib/tp_plus/nodes/time_node.rb +24 -24
  50. data/lib/tp_plus/nodes/timer_method_node.rb +37 -37
  51. data/lib/tp_plus/nodes/timer_node.rb +16 -21
  52. data/lib/tp_plus/nodes/units_node.rb +20 -20
  53. data/lib/tp_plus/nodes/use_node.rb +21 -21
  54. data/lib/tp_plus/nodes/user_alarm_node.rb +16 -15
  55. data/lib/tp_plus/nodes/var_method_node.rb +23 -23
  56. data/lib/tp_plus/nodes/var_node.rb +39 -39
  57. data/lib/tp_plus/nodes/vision_register_node.rb +22 -21
  58. data/lib/tp_plus/nodes/wait_for_node.rb +54 -54
  59. data/lib/tp_plus/nodes/wait_until_node.rb +65 -65
  60. data/lib/tp_plus/nodes/while_node.rb +42 -36
  61. data/lib/tp_plus/parser.rb +1682 -1592
  62. data/lib/tp_plus/scanner.rb +283 -383
  63. data/lib/tp_plus/token.rb +97 -0
  64. data/lib/tp_plus/version.rb +3 -3
  65. data/lib/tp_plus.rb +66 -62
  66. data/test/test_helper.rb +5 -5
  67. data/test/tp_plus/test_interpreter.rb +1309 -1168
  68. data/test/tp_plus/test_parser.rb +496 -489
  69. data/test/tp_plus/test_scanner.rb +577 -522
  70. data/tp_plus.gemspec +31 -28
  71. metadata +61 -14
  72. data/lib/tp_plus/nodes/set_node.rb +0 -22
@@ -1,65 +1,65 @@
1
- module TPPlus
2
- module Nodes
3
- class WaitUntilNode
4
- def initialize(expression, timeout_options)
5
- @expression = expression
6
- @timeout_options = timeout_options || {}
7
- end
8
-
9
- def timeout(context)
10
- return "" if @timeout_options[:label].nil?
11
-
12
- " TIMEOUT,LBL[#{context.labels[@timeout_options[:label].to_sym]}]"
13
- end
14
-
15
- def val(context)
16
- value_node = @timeout_options[:timeout][0]
17
- units = @timeout_options[:timeout][1]
18
-
19
- if value_node.is_a?(VarNode)
20
- value = value_node.eval(context)
21
-
22
- case units
23
- when "s"
24
- value = "#{value}*100"
25
- when "ms"
26
- value = "#{value}*.1"
27
- else
28
- raise "invalid units"
29
- end
30
- else
31
- value = value_node.eval(context).to_i
32
-
33
- case units
34
- when "s"
35
- value = (value * 100).to_i
36
- when "ms"
37
- value = (value * 0.1).to_i
38
- else
39
- raise "invalid units"
40
- end
41
- end
42
-
43
- value
44
- end
45
-
46
- def can_be_inlined?
47
- false
48
- end
49
-
50
- def wait_timeout(context)
51
- return "" if @timeout_options[:timeout].nil?
52
-
53
- "$WAITTMOUT=(#{val(context)}) ;\n"
54
- end
55
-
56
- def string_value(context)
57
- "#{@expression.eval(context, force_parens: true)}"
58
- end
59
-
60
- def eval(context)
61
- "#{wait_timeout(context)}WAIT #{string_value(context)}#{timeout(context)}"
62
- end
63
- end
64
- end
65
- end
1
+ module TPPlus
2
+ module Nodes
3
+ class WaitUntilNode
4
+ def initialize(expression, timeout_options)
5
+ @expression = expression
6
+ @timeout_options = timeout_options || {}
7
+ end
8
+
9
+ def timeout(context)
10
+ return "" if @timeout_options[:label].nil?
11
+
12
+ " TIMEOUT,LBL[#{context.labels[@timeout_options[:label].to_sym]}]"
13
+ end
14
+
15
+ def val(context)
16
+ value_node = @timeout_options[:timeout][0]
17
+ units = @timeout_options[:timeout][1]
18
+
19
+ if value_node.is_a?(VarNode)
20
+ value = value_node.eval(context)
21
+
22
+ case units
23
+ when "s"
24
+ value = "#{value}*100"
25
+ when "ms"
26
+ value = "#{value}*.1"
27
+ else
28
+ raise "invalid units"
29
+ end
30
+ else
31
+ value = value_node.eval(context).to_i
32
+
33
+ case units
34
+ when "s"
35
+ value = (value * 100).to_i
36
+ when "ms"
37
+ value = (value * 0.1).to_i
38
+ else
39
+ raise "invalid units"
40
+ end
41
+ end
42
+
43
+ value
44
+ end
45
+
46
+ def can_be_inlined?
47
+ false
48
+ end
49
+
50
+ def wait_timeout(context)
51
+ return "" if @timeout_options[:timeout].nil?
52
+
53
+ "$WAITTMOUT=(#{val(context)}) ;\n"
54
+ end
55
+
56
+ def string_value(context)
57
+ "(#{@expression.eval(context)})"
58
+ end
59
+
60
+ def eval(context)
61
+ "#{wait_timeout(context)}WAIT #{string_value(context)}#{timeout(context)}"
62
+ end
63
+ end
64
+ end
65
+ end
@@ -1,36 +1,42 @@
1
- module TPPlus
2
- module Nodes
3
- class WhileNode
4
- def initialize(condition_node, block)
5
- @condition_node = condition_node
6
- @block = block.flatten.reject {|n| n.is_a?(TerminatorNode) }
7
- end
8
-
9
- def top_label(context)
10
- @top_label ||= context.next_label
11
- end
12
-
13
- def bottom_label(context)
14
- @bottom_label ||= context.next_label
15
- end
16
-
17
- def if_statement(context)
18
- "IF #{condition(context)},JMP LBL[#{bottom_label(context)}] ;\n"
19
- end
20
-
21
-
22
- def condition(context)
23
- @condition_node.eval(context, opposite: true, as_condition: true)
24
- end
25
-
26
-
27
- def block(context)
28
- @block.inject("") {|s,n| s << "#{n.eval(context)} ;\n" }
29
- end
30
-
31
- def eval(context)
32
- "LBL[#{top_label(context)}] ;\n#{if_statement(context)}#{block(context)}JMP LBL[#{top_label(context)}] ;\nLBL[#{bottom_label(context)}]"
33
- end
34
- end
35
- end
36
- end
1
+ module TPPlus
2
+ module Nodes
3
+ class WhileNode
4
+ def initialize(condition_node, block)
5
+ @condition_node = condition_node
6
+ @block = block.flatten.reject {|n| n.is_a?(TerminatorNode) }
7
+ end
8
+
9
+ def top_label(context)
10
+ @top_label ||= context.next_label
11
+ end
12
+
13
+ def bottom_label(context)
14
+ @bottom_label ||= context.next_label
15
+ end
16
+
17
+ def parens(s, context)
18
+ return s unless @condition_node.requires_mixed_logic?(context)
19
+
20
+ "(#{s})"
21
+ end
22
+
23
+ def if_statement(context)
24
+ "IF #{parens(condition(context), context)},JMP LBL[#{bottom_label(context)}] ;\n"
25
+ end
26
+
27
+
28
+ def condition(context)
29
+ @condition_node.eval(context, opposite: true)
30
+ end
31
+
32
+
33
+ def block(context)
34
+ @block.inject("") {|s,n| s << "#{n.eval(context)} ;\n" }
35
+ end
36
+
37
+ def eval(context)
38
+ "LBL[#{top_label(context)}] ;\n#{if_statement(context)}#{block(context)}JMP LBL[#{top_label(context)}] ;\nLBL[#{bottom_label(context)}]"
39
+ end
40
+ end
41
+ end
42
+ end