rley 0.7.06 → 0.8.01

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 (167) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +362 -62
  3. data/.travis.yml +6 -6
  4. data/CHANGELOG.md +20 -4
  5. data/LICENSE.txt +1 -1
  6. data/README.md +7 -7
  7. data/examples/NLP/engtagger.rb +193 -190
  8. data/examples/NLP/nano_eng/nano_en_demo.rb +7 -11
  9. data/examples/NLP/nano_eng/nano_grammar.rb +21 -21
  10. data/examples/NLP/pico_en_demo.rb +2 -2
  11. data/examples/data_formats/JSON/cli_options.rb +1 -1
  12. data/examples/data_formats/JSON/json_ast_builder.rb +21 -27
  13. data/examples/data_formats/JSON/json_ast_nodes.rb +12 -21
  14. data/examples/data_formats/JSON/json_demo.rb +1 -2
  15. data/examples/data_formats/JSON/json_grammar.rb +13 -13
  16. data/examples/data_formats/JSON/json_lexer.rb +8 -8
  17. data/examples/data_formats/JSON/json_minifier.rb +1 -1
  18. data/examples/general/calc_iter1/calc_ast_builder.rb +13 -10
  19. data/examples/general/calc_iter1/calc_ast_nodes.rb +23 -37
  20. data/examples/general/calc_iter1/calc_grammar.rb +7 -6
  21. data/examples/general/calc_iter1/calc_lexer.rb +6 -4
  22. data/examples/general/calc_iter1/spec/calculator_spec.rb +5 -5
  23. data/examples/general/calc_iter2/calc_ast_builder.rb +5 -3
  24. data/examples/general/calc_iter2/calc_ast_nodes.rb +27 -43
  25. data/examples/general/calc_iter2/calc_grammar.rb +12 -12
  26. data/examples/general/calc_iter2/calc_lexer.rb +11 -10
  27. data/examples/general/calc_iter2/spec/calculator_spec.rb +26 -26
  28. data/examples/general/left.rb +2 -2
  29. data/examples/general/right.rb +2 -2
  30. data/lib/rley.rb +1 -1
  31. data/lib/rley/base/dotted_item.rb +28 -31
  32. data/lib/rley/base/grm_items_builder.rb +6 -0
  33. data/lib/rley/constants.rb +2 -2
  34. data/lib/rley/engine.rb +22 -25
  35. data/lib/rley/formatter/asciitree.rb +3 -3
  36. data/lib/rley/formatter/bracket_notation.rb +1 -8
  37. data/lib/rley/formatter/debug.rb +6 -6
  38. data/lib/rley/formatter/json.rb +2 -2
  39. data/lib/rley/gfg/call_edge.rb +1 -1
  40. data/lib/rley/gfg/edge.rb +5 -5
  41. data/lib/rley/gfg/end_vertex.rb +2 -6
  42. data/lib/rley/gfg/epsilon_edge.rb +1 -5
  43. data/lib/rley/gfg/grm_flow_graph.rb +27 -23
  44. data/lib/rley/gfg/item_vertex.rb +10 -10
  45. data/lib/rley/gfg/non_terminal_vertex.rb +4 -4
  46. data/lib/rley/gfg/scan_edge.rb +1 -1
  47. data/lib/rley/gfg/shortcut_edge.rb +2 -2
  48. data/lib/rley/gfg/start_vertex.rb +4 -8
  49. data/lib/rley/gfg/vertex.rb +43 -39
  50. data/lib/rley/interface.rb +16 -0
  51. data/lib/rley/lexical/token_range.rb +6 -6
  52. data/lib/rley/notation/all_notation_nodes.rb +2 -0
  53. data/lib/rley/notation/ast_builder.rb +191 -0
  54. data/lib/rley/notation/ast_node.rb +44 -0
  55. data/lib/rley/notation/ast_visitor.rb +113 -0
  56. data/lib/rley/notation/grammar.rb +49 -0
  57. data/lib/rley/notation/grammar_builder.rb +504 -0
  58. data/lib/rley/notation/grouping_node.rb +23 -0
  59. data/lib/rley/notation/parser.rb +56 -0
  60. data/lib/rley/notation/sequence_node.rb +35 -0
  61. data/lib/rley/notation/symbol_node.rb +29 -0
  62. data/lib/rley/notation/tokenizer.rb +192 -0
  63. data/lib/rley/parse_forest_visitor.rb +5 -5
  64. data/lib/rley/parse_rep/ast_base_builder.rb +48 -11
  65. data/lib/rley/parse_rep/cst_builder.rb +5 -6
  66. data/lib/rley/parse_rep/parse_forest_builder.rb +22 -18
  67. data/lib/rley/parse_rep/parse_forest_factory.rb +3 -3
  68. data/lib/rley/parse_rep/parse_rep_creator.rb +14 -16
  69. data/lib/rley/parse_rep/parse_tree_builder.rb +4 -4
  70. data/lib/rley/parse_rep/parse_tree_factory.rb +27 -27
  71. data/lib/rley/parse_tree_visitor.rb +1 -1
  72. data/lib/rley/parser/error_reason.rb +4 -5
  73. data/lib/rley/parser/gfg_chart.rb +118 -26
  74. data/lib/rley/parser/gfg_parsing.rb +22 -33
  75. data/lib/rley/parser/parse_entry.rb +25 -31
  76. data/lib/rley/parser/parse_entry_set.rb +19 -16
  77. data/lib/rley/parser/parse_entry_tracker.rb +4 -4
  78. data/lib/rley/parser/parse_tracer.rb +13 -13
  79. data/lib/rley/parser/parse_walker_factory.rb +23 -28
  80. data/lib/rley/ptree/non_terminal_node.rb +7 -5
  81. data/lib/rley/ptree/parse_tree.rb +3 -3
  82. data/lib/rley/ptree/parse_tree_node.rb +5 -5
  83. data/lib/rley/ptree/terminal_node.rb +7 -7
  84. data/lib/rley/rley_error.rb +12 -12
  85. data/lib/rley/sppf/alternative_node.rb +6 -6
  86. data/lib/rley/sppf/composite_node.rb +7 -7
  87. data/lib/rley/sppf/epsilon_node.rb +3 -3
  88. data/lib/rley/sppf/leaf_node.rb +3 -3
  89. data/lib/rley/sppf/parse_forest.rb +16 -16
  90. data/lib/rley/sppf/sppf_node.rb +7 -8
  91. data/lib/rley/sppf/token_node.rb +3 -3
  92. data/lib/rley/syntax/{grammar_builder.rb → base_grammar_builder.rb} +61 -23
  93. data/lib/rley/syntax/grammar.rb +5 -5
  94. data/lib/rley/syntax/grm_symbol.rb +7 -7
  95. data/lib/rley/syntax/match_closest.rb +43 -0
  96. data/lib/rley/syntax/non_terminal.rb +9 -15
  97. data/lib/rley/syntax/production.rb +16 -10
  98. data/lib/rley/syntax/symbol_seq.rb +7 -9
  99. data/lib/rley/syntax/terminal.rb +4 -5
  100. data/lib/rley/syntax/verbatim_symbol.rb +3 -3
  101. data/lib/support/base_tokenizer.rb +19 -18
  102. data/spec/rley/base/dotted_item_spec.rb +2 -2
  103. data/spec/rley/engine_spec.rb +23 -21
  104. data/spec/rley/formatter/asciitree_spec.rb +7 -7
  105. data/spec/rley/formatter/bracket_notation_spec.rb +13 -13
  106. data/spec/rley/formatter/json_spec.rb +1 -1
  107. data/spec/rley/gfg/end_vertex_spec.rb +5 -5
  108. data/spec/rley/gfg/grm_flow_graph_spec.rb +2 -2
  109. data/spec/rley/gfg/item_vertex_spec.rb +10 -10
  110. data/spec/rley/gfg/non_terminal_vertex_spec.rb +3 -3
  111. data/spec/rley/gfg/shortcut_edge_spec.rb +1 -1
  112. data/spec/rley/gfg/start_vertex_spec.rb +5 -5
  113. data/spec/rley/gfg/vertex_spec.rb +3 -3
  114. data/spec/rley/lexical/token_range_spec.rb +16 -16
  115. data/spec/rley/lexical/token_spec.rb +2 -2
  116. data/spec/rley/notation/grammar_builder_spec.rb +302 -0
  117. data/spec/rley/notation/parser_spec.rb +184 -0
  118. data/spec/rley/notation/tokenizer_spec.rb +370 -0
  119. data/spec/rley/parse_forest_visitor_spec.rb +165 -163
  120. data/spec/rley/parse_rep/ambiguous_parse_spec.rb +44 -44
  121. data/spec/rley/parse_rep/ast_builder_spec.rb +6 -7
  122. data/spec/rley/parse_rep/cst_builder_spec.rb +5 -5
  123. data/spec/rley/parse_rep/groucho_spec.rb +24 -26
  124. data/spec/rley/parse_rep/parse_forest_builder_spec.rb +27 -27
  125. data/spec/rley/parse_rep/parse_forest_factory_spec.rb +8 -8
  126. data/spec/rley/parse_rep/parse_tree_factory_spec.rb +3 -3
  127. data/spec/rley/parse_tree_visitor_spec.rb +10 -8
  128. data/spec/rley/parser/dangling_else_spec.rb +445 -0
  129. data/spec/rley/parser/error_reason_spec.rb +6 -6
  130. data/spec/rley/parser/gfg_earley_parser_spec.rb +120 -12
  131. data/spec/rley/parser/gfg_parsing_spec.rb +6 -13
  132. data/spec/rley/parser/parse_entry_spec.rb +19 -19
  133. data/spec/rley/parser/parse_walker_factory_spec.rb +10 -10
  134. data/spec/rley/ptree/non_terminal_node_spec.rb +5 -3
  135. data/spec/rley/ptree/parse_tree_node_spec.rb +4 -4
  136. data/spec/rley/ptree/terminal_node_spec.rb +6 -6
  137. data/spec/rley/sppf/alternative_node_spec.rb +6 -6
  138. data/spec/rley/sppf/non_terminal_node_spec.rb +3 -3
  139. data/spec/rley/sppf/token_node_spec.rb +4 -4
  140. data/spec/rley/support/ambiguous_grammar_helper.rb +4 -5
  141. data/spec/rley/support/grammar_abc_helper.rb +3 -5
  142. data/spec/rley/support/grammar_ambig01_helper.rb +5 -6
  143. data/spec/rley/support/grammar_arr_int_helper.rb +5 -6
  144. data/spec/rley/support/grammar_b_expr_helper.rb +5 -6
  145. data/spec/rley/support/grammar_int_seq_helper.rb +51 -0
  146. data/spec/rley/support/grammar_l0_helper.rb +14 -17
  147. data/spec/rley/support/grammar_pb_helper.rb +8 -7
  148. data/spec/rley/support/grammar_sppf_helper.rb +3 -3
  149. data/spec/rley/syntax/{grammar_builder_spec.rb → base_grammar_builder_spec.rb} +35 -16
  150. data/spec/rley/syntax/grammar_spec.rb +6 -6
  151. data/spec/rley/syntax/grm_symbol_spec.rb +1 -1
  152. data/spec/rley/syntax/match_closest_spec.rb +46 -0
  153. data/spec/rley/syntax/non_terminal_spec.rb +8 -8
  154. data/spec/rley/syntax/production_spec.rb +17 -13
  155. data/spec/rley/syntax/symbol_seq_spec.rb +2 -2
  156. data/spec/rley/syntax/terminal_spec.rb +5 -5
  157. data/spec/rley/syntax/verbatim_symbol_spec.rb +1 -1
  158. data/spec/spec_helper.rb +0 -12
  159. data/spec/support/base_tokenizer_spec.rb +7 -2
  160. metadata +48 -74
  161. data/.simplecov +0 -7
  162. data/lib/rley/parser/parse_state.rb +0 -83
  163. data/lib/rley/parser/parse_state_tracker.rb +0 -59
  164. data/lib/rley/parser/state_set.rb +0 -101
  165. data/spec/rley/parser/parse_state_spec.rb +0 -125
  166. data/spec/rley/parser/parse_tracer_spec.rb +0 -200
  167. data/spec/rley/parser/state_set_spec.rb +0 -130
@@ -3,7 +3,6 @@
3
3
  # Classes that implement nodes of Abstract Syntax Trees (AST) representing
4
4
  # calculator parse results.
5
5
 
6
-
7
6
  CalcTerminalNode = Struct.new(:token, :value, :position) do
8
7
  def initialize(aToken, aPosition)
9
8
  self.token = aToken
@@ -16,23 +15,23 @@ CalcTerminalNode = Struct.new(:token, :value, :position) do
16
15
  self.value = aLiteral.dup
17
16
  end
18
17
 
19
- def symbol()
18
+ def symbol
20
19
  token.terminal
21
20
  end
22
21
 
23
- def interpret()
24
- return value
22
+ def interpret
23
+ value
25
24
  end
26
-
27
- def done!()
25
+
26
+ def done!
28
27
  # Do nothing
29
28
  end
30
-
29
+
31
30
  # Part of the 'visitee' role in Visitor design pattern.
32
31
  # @param aVisitor[ParseTreeVisitor] the visitor
33
32
  def accept(aVisitor)
34
33
  aVisitor.visit_terminal(self)
35
- end
34
+ end
36
35
  end
37
36
 
38
37
  class CalcNumberNode < CalcTerminalNode
@@ -53,30 +52,26 @@ class CalcCompositeNode
53
52
 
54
53
  def initialize(aSymbol)
55
54
  @symbol = aSymbol
56
- @children = []
55
+ @children = []
57
56
  end
58
-
59
- def done!()
57
+
58
+ def done!
60
59
  # Do nothing
61
- end
60
+ end
62
61
 
63
62
  # Part of the 'visitee' role in Visitor design pattern.
64
63
  # @param aVisitor[ParseTreeVisitor] the visitor
65
64
  def accept(aVisitor)
66
65
  aVisitor.visit_nonterminal(self)
67
66
  end
68
-
67
+
69
68
  alias subnodes children
70
69
  end # class
71
70
 
72
71
  class CalcUnaryOpNode < CalcCompositeNode
73
- def initialize(aSymbol)
74
- super(aSymbol)
75
- end
76
-
77
72
  # Convert this tree node in a simpler Ruby representation.
78
73
  # Basically a Calc object corresponds to a Ruhy Hash
79
- def to_ruby()
74
+ def to_ruby
80
75
  rep = {}
81
76
  members.each do |pair|
82
77
  rep[pair.name.to_ruby] = pair.value.to_ruby
@@ -92,13 +87,9 @@ class CalcNegateNode < CalcUnaryOpNode
92
87
  end # class
93
88
 
94
89
  class CalcBinaryOpNode < CalcCompositeNode
95
- def initialize(aSymbol)
96
- super(aSymbol)
97
- end
98
-
99
90
  protected
100
-
101
- def retrieve_operands()
91
+
92
+ def retrieve_operands
102
93
  operands = []
103
94
  children.each do |child|
104
95
  oper = child.respond_to?(:interpret) ? child.interpret : child
@@ -111,42 +102,37 @@ end # class
111
102
 
112
103
  class CalcAddNode < CalcBinaryOpNode
113
104
  # TODO
114
- def interpret()
105
+ def interpret
115
106
  operands = retrieve_operands
116
107
 
117
- sum = operands[0] + operands[1]
118
- return sum
108
+ operands[0] + operands[1]
119
109
  end
120
110
  end # class
121
111
 
122
-
123
112
  class CalcSubtractNode < CalcBinaryOpNode
124
113
  # TODO
125
- def interpret()
114
+ def interpret
126
115
  operands = retrieve_operands
127
116
 
128
- substraction = operands[0] - operands[1]
129
- return substraction
117
+ operands[0] - operands[1]
130
118
  end
131
119
  end # class
132
120
 
133
121
  class CalcMultiplyNode < CalcBinaryOpNode
134
122
  # TODO
135
- def interpret()
123
+ def interpret
136
124
  operands = retrieve_operands
137
- multiplication = operands[0] * operands[1]
138
- return multiplication
125
+ operands[0] * operands[1]
139
126
  end
140
127
  end # class
141
128
 
142
129
  class CalcDivideNode < CalcBinaryOpNode
143
130
  # TODO
144
- def interpret()
131
+ def interpret
145
132
  operands = retrieve_operands
146
133
  numerator = operands[0].to_f
147
134
  denominator = operands[1]
148
- division = numerator / denominator
149
- return division
135
+ numerator / denominator
150
136
  end
151
137
  end # class
152
138
  # End of file
@@ -5,22 +5,23 @@ require 'rley' # Load the gem
5
5
 
6
6
  ########################################
7
7
  # Define a grammar for basic arithmetical expressions
8
- builder = Rley::Syntax::GrammarBuilder.new do
8
+ builder = Rley::grammar_builder do
9
9
  add_terminals('NUMBER')
10
10
  add_terminals('LPAREN', 'RPAREN') # For '(', ')' delimiters
11
11
  add_terminals('PLUS', 'MINUS') # For '+', '-' operators
12
12
  add_terminals('STAR', 'DIVIDE') # For '*', '/' operators
13
+
13
14
  rule 'expression' => 'simple_expression'
14
15
  rule 'simple_expression' => 'term'
15
- rule 'simple_expression' => %w[simple_expression add_operator term]
16
+ rule 'simple_expression' => 'simple_expression add_operator term'
16
17
  rule 'term' => 'factor'
17
- rule 'term' => %w[term mul_operator factor]
18
+ rule 'term' => 'term mul_operator factor'
18
19
  rule 'factor' => 'NUMBER'
19
- rule 'factor' => %w[LPAREN expression RPAREN]
20
+ rule 'factor' => 'LPAREN expression RPAREN'
20
21
  rule 'add_operator' => 'PLUS'
21
- rule 'add_operator' => 'MINUS'
22
+ rule 'add_operator' => 'MINUS'
22
23
  rule 'mul_operator' => 'STAR'
23
- rule 'mul_operator' => 'DIVIDE'
24
+ rule 'mul_operator' => 'DIVIDE'
24
25
  end
25
26
 
26
27
  # And now build the grammar...
@@ -28,7 +28,7 @@ class CalcLexer
28
28
  @lineno = 1
29
29
  end
30
30
 
31
- def tokens()
31
+ def tokens
32
32
  tok_sequence = []
33
33
  until @scanner.eos?
34
34
  token = _next_token
@@ -40,7 +40,8 @@ class CalcLexer
40
40
 
41
41
  private
42
42
 
43
- def _next_token()
43
+ # rubocop: disable Lint/DuplicateBranch
44
+ def _next_token
44
45
  skip_whitespaces
45
46
  curr_ch = scanner.peek(1)
46
47
  return nil if curr_ch.nil?
@@ -63,18 +64,19 @@ class CalcLexer
63
64
  erroneous = curr_ch.nil? ? '' : curr_ch
64
65
  sequel = scanner.scan(/.{1,20}/)
65
66
  erroneous += sequel unless sequel.nil?
66
- raise ScanError.new("Unknown token #{erroneous}")
67
+ raise ScanError, "Unknown token #{erroneous}"
67
68
  end
68
69
 
69
70
  return token
70
71
  end
72
+ # rubocop: enable Lint/DuplicateBranch
71
73
 
72
74
  def build_token(aSymbolName, aLexeme)
73
75
  pos = Rley::Lexical::Position.new(1, scanner.pos)
74
76
  return Rley::Lexical::Token.new(aLexeme, aSymbolName, pos)
75
77
  end
76
78
 
77
- def skip_whitespaces()
79
+ def skip_whitespaces
78
80
  scanner.scan(/[ \t\f\n\r]+/)
79
81
  end
80
82
  end # class
@@ -12,13 +12,13 @@ describe 'Calculator' do
12
12
  engine = Rley::Engine.new do |cfg|
13
13
  cfg.repr_builder = CalcASTBuilder
14
14
  end
15
-
15
+
16
16
  engine.use_grammar(CalcGrammar)
17
17
  raw_result = parse_expression(engine, anExpression)
18
18
  ast = engine.to_ptree(raw_result)
19
19
  return expect(ast.root.interpret)
20
20
  end
21
-
21
+
22
22
  def parse_expression(anEngine, anExpression)
23
23
  lexer = CalcLexer.new(anExpression)
24
24
  result = anEngine.parse(lexer.tokens)
@@ -31,7 +31,7 @@ describe 'Calculator' do
31
31
  end
32
32
 
33
33
  return result
34
- end
34
+ end
35
35
 
36
36
  it 'should evaluate simple number literals' do
37
37
  expect_expr('2').to eq(2)
@@ -56,7 +56,7 @@ describe 'Calculator' do
56
56
  it 'should evaluate parentheses' do
57
57
  expect_expr('2 * (2.1 + 1)').to eq(6.2)
58
58
  end
59
-
59
+
60
60
  it 'should evaluate regardless of whitespace' do
61
61
  expect_expr("2*(1+\t1)").to eq(4)
62
62
  end
@@ -67,6 +67,6 @@ describe 'Calculator' do
67
67
 
68
68
  it 'should evaluate multiple levels of parentheses' do
69
69
  expect_expr('2*(1/(1+3))').to eq(0.5)
70
- end
70
+ end
71
71
  end # describe
72
72
  # End of file
@@ -15,8 +15,7 @@ class CalcASTBuilder < Rley::ParseRep::ASTBaseBuilder
15
15
  # The unary negation operator on one hand, the binary substraction operator
16
16
  'MINUS' => { 'add_operator_1' => Rley::PTree::TerminalNode,
17
17
  'simple_factor_2' => CalcNegateNode,
18
- 'sign_1' => CalcNegateNode
19
- },
18
+ 'sign_1' => CalcNegateNode },
20
19
  'NUMBER' => CalcNumberNode,
21
20
  'PI' => CalcConstantNode,
22
21
  'E' => CalcConstantNode,
@@ -25,7 +24,7 @@ class CalcASTBuilder < Rley::ParseRep::ASTBaseBuilder
25
24
 
26
25
  protected
27
26
 
28
- def terminal2node()
27
+ def terminal2node
29
28
  Terminal2NodeClass
30
29
  end
31
30
 
@@ -36,6 +35,8 @@ class CalcASTBuilder < Rley::ParseRep::ASTBaseBuilder
36
35
  return operator_node
37
36
  end
38
37
 
38
+ # rubocop: disable Naming/VariableNumber
39
+
39
40
  # rule 'simple_expression' => %w[simple_expression add_operator term]
40
41
  def reduce_simple_expression_1(_production, _range, _tokens, theChildren)
41
42
  reduce_binary_operator(theChildren)
@@ -106,5 +107,6 @@ class CalcASTBuilder < Rley::ParseRep::ASTBaseBuilder
106
107
  def reduce_mul_operator_1(_production, aRange, _tokens, theChildren)
107
108
  return CalcDivideNode.new(theChildren[0].symbol, aRange)
108
109
  end
110
+ # rubocop: enable Naming/VariableNumber
109
111
  end # class
110
112
  # End of file
@@ -3,7 +3,6 @@
3
3
  # Classes that implement nodes of Abstract Syntax Trees (AST) representing
4
4
  # calculator parse results.
5
5
 
6
-
7
6
  CalcTerminalNode = Struct.new(:token, :value, :position) do
8
7
  def initialize(aToken, aPosition)
9
8
  self.token = aToken
@@ -16,15 +15,15 @@ CalcTerminalNode = Struct.new(:token, :value, :position) do
16
15
  self.value = aLiteral.dup
17
16
  end
18
17
 
19
- def symbol()
18
+ def symbol
20
19
  token.terminal
21
20
  end
22
21
 
23
- def interpret()
24
- return value
22
+ def interpret
23
+ value
25
24
  end
26
-
27
- def done!()
25
+
26
+ def done!
28
27
  # Do nothing
29
28
  end
30
29
 
@@ -45,9 +44,9 @@ class CalcNumberNode < CalcTerminalNode
45
44
  self.value = aLiteral.to_f
46
45
  end
47
46
  end
48
-
47
+
49
48
  # Overriding the unary minus operator
50
- def -@()
49
+ def -@
51
50
  self.value = - value
52
51
  return self
53
52
  end
@@ -83,8 +82,8 @@ class CalcCompositeNode
83
82
  def accept(aVisitor)
84
83
  aVisitor.visit_nonterminal(self)
85
84
  end
86
-
87
- def done!()
85
+
86
+ def done!
88
87
  # Do nothing
89
88
  end
90
89
 
@@ -92,44 +91,36 @@ class CalcCompositeNode
92
91
  end # class
93
92
 
94
93
  class CalcUnaryOpNode < CalcCompositeNode
95
- def initialize(aSymbol, aPosition)
96
- super(aSymbol, aPosition)
97
- end
98
-
99
94
  alias members children
100
95
  end # class
101
96
 
102
- class CalcNegateNode < CalcUnaryOpNode
103
- def interpret()
97
+ class CalcNegateNode < CalcUnaryOpNode
98
+ def interpret
104
99
  return -children[0].interpret
105
100
  end
106
101
  end # class
107
102
 
108
103
  class CalcUnaryFunction < CalcCompositeNode
109
- @@name_mapping = begin
104
+ @@name_mapping = begin
110
105
  map = Hash.new { |me, key| me[key] = key }
111
106
  map['ln'] = 'log'
112
107
  map['log'] = 'log10'
113
108
  map
114
109
  end
115
110
  attr_accessor(:func_name)
116
-
117
-
118
- def interpret()
111
+
112
+
113
+ def interpret
119
114
  argument = children[0].interpret
120
115
  internal_name = @@name_mapping[@func_name]
121
116
  return Math.send(internal_name.to_sym, argument)
122
- end
117
+ end
123
118
  end
124
119
 
125
120
  class CalcBinaryOpNode < CalcCompositeNode
126
- def initialize(aSymbol, aRange)
127
- super(aSymbol, aRange)
128
- end
129
-
130
121
  protected
131
122
 
132
- def retrieve_operands()
123
+ def retrieve_operands
133
124
  operands = []
134
125
  children.each do |child|
135
126
  oper = child.respond_to?(:interpret) ? child.interpret : child
@@ -142,52 +133,45 @@ end # class
142
133
 
143
134
  class CalcAddNode < CalcBinaryOpNode
144
135
  # TODO
145
- def interpret()
136
+ def interpret
146
137
  operands = retrieve_operands
147
138
 
148
- sum = operands[0] + operands[1]
149
- return sum
139
+ operands[0] + operands[1]
150
140
  end
151
141
  end # class
152
142
 
153
-
154
143
  class CalcSubtractNode < CalcBinaryOpNode
155
144
  # TODO
156
- def interpret()
145
+ def interpret
157
146
  operands = retrieve_operands
158
147
 
159
- substraction = operands[0] - operands[1]
160
- return substraction
148
+ operands[0] - operands[1]
161
149
  end
162
150
  end # class
163
151
 
164
152
  class CalcMultiplyNode < CalcBinaryOpNode
165
153
  # TODO
166
- def interpret()
154
+ def interpret
167
155
  operands = retrieve_operands
168
- multiplication = operands[0] * operands[1]
169
- return multiplication
156
+ operands[0] * operands[1]
170
157
  end
171
158
  end # class
172
159
 
173
160
  class CalcDivideNode < CalcBinaryOpNode
174
161
  # TODO
175
- def interpret()
162
+ def interpret
176
163
  operands = retrieve_operands
177
164
  numerator = operands[0].to_f
178
165
  denominator = operands[1]
179
- division = numerator / denominator
180
- return division
166
+ numerator / denominator
181
167
  end
182
168
  end # class
183
169
 
184
-
185
170
  class PowerNode < CalcBinaryOpNode
186
171
  # TODO
187
- def interpret()
172
+ def interpret
188
173
  operands = retrieve_operands
189
- exponentiation = operands[0]**operands[1]
190
- return exponentiation
174
+ operands[0]**operands[1]
191
175
  end
192
176
  end # class
193
177
  # End of file