rley 0.7.06 → 0.8.01

Sign up to get free protection for your applications and to get access to all the features.
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