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.
- checksums.yaml +4 -4
- data/.rubocop.yml +362 -62
- data/.travis.yml +6 -6
- data/CHANGELOG.md +20 -4
- data/LICENSE.txt +1 -1
- data/README.md +7 -7
- data/examples/NLP/engtagger.rb +193 -190
- data/examples/NLP/nano_eng/nano_en_demo.rb +7 -11
- data/examples/NLP/nano_eng/nano_grammar.rb +21 -21
- data/examples/NLP/pico_en_demo.rb +2 -2
- data/examples/data_formats/JSON/cli_options.rb +1 -1
- data/examples/data_formats/JSON/json_ast_builder.rb +21 -27
- data/examples/data_formats/JSON/json_ast_nodes.rb +12 -21
- data/examples/data_formats/JSON/json_demo.rb +1 -2
- data/examples/data_formats/JSON/json_grammar.rb +13 -13
- data/examples/data_formats/JSON/json_lexer.rb +8 -8
- data/examples/data_formats/JSON/json_minifier.rb +1 -1
- data/examples/general/calc_iter1/calc_ast_builder.rb +13 -10
- data/examples/general/calc_iter1/calc_ast_nodes.rb +23 -37
- data/examples/general/calc_iter1/calc_grammar.rb +7 -6
- data/examples/general/calc_iter1/calc_lexer.rb +6 -4
- data/examples/general/calc_iter1/spec/calculator_spec.rb +5 -5
- data/examples/general/calc_iter2/calc_ast_builder.rb +5 -3
- data/examples/general/calc_iter2/calc_ast_nodes.rb +27 -43
- data/examples/general/calc_iter2/calc_grammar.rb +12 -12
- data/examples/general/calc_iter2/calc_lexer.rb +11 -10
- data/examples/general/calc_iter2/spec/calculator_spec.rb +26 -26
- data/examples/general/left.rb +2 -2
- data/examples/general/right.rb +2 -2
- data/lib/rley.rb +1 -1
- data/lib/rley/base/dotted_item.rb +28 -31
- data/lib/rley/base/grm_items_builder.rb +6 -0
- data/lib/rley/constants.rb +2 -2
- data/lib/rley/engine.rb +22 -25
- data/lib/rley/formatter/asciitree.rb +3 -3
- data/lib/rley/formatter/bracket_notation.rb +1 -8
- data/lib/rley/formatter/debug.rb +6 -6
- data/lib/rley/formatter/json.rb +2 -2
- data/lib/rley/gfg/call_edge.rb +1 -1
- data/lib/rley/gfg/edge.rb +5 -5
- data/lib/rley/gfg/end_vertex.rb +2 -6
- data/lib/rley/gfg/epsilon_edge.rb +1 -5
- data/lib/rley/gfg/grm_flow_graph.rb +27 -23
- data/lib/rley/gfg/item_vertex.rb +10 -10
- data/lib/rley/gfg/non_terminal_vertex.rb +4 -4
- data/lib/rley/gfg/scan_edge.rb +1 -1
- data/lib/rley/gfg/shortcut_edge.rb +2 -2
- data/lib/rley/gfg/start_vertex.rb +4 -8
- data/lib/rley/gfg/vertex.rb +43 -39
- data/lib/rley/interface.rb +16 -0
- data/lib/rley/lexical/token_range.rb +6 -6
- data/lib/rley/notation/all_notation_nodes.rb +2 -0
- data/lib/rley/notation/ast_builder.rb +191 -0
- data/lib/rley/notation/ast_node.rb +44 -0
- data/lib/rley/notation/ast_visitor.rb +113 -0
- data/lib/rley/notation/grammar.rb +49 -0
- data/lib/rley/notation/grammar_builder.rb +504 -0
- data/lib/rley/notation/grouping_node.rb +23 -0
- data/lib/rley/notation/parser.rb +56 -0
- data/lib/rley/notation/sequence_node.rb +35 -0
- data/lib/rley/notation/symbol_node.rb +29 -0
- data/lib/rley/notation/tokenizer.rb +192 -0
- data/lib/rley/parse_forest_visitor.rb +5 -5
- data/lib/rley/parse_rep/ast_base_builder.rb +48 -11
- data/lib/rley/parse_rep/cst_builder.rb +5 -6
- data/lib/rley/parse_rep/parse_forest_builder.rb +22 -18
- data/lib/rley/parse_rep/parse_forest_factory.rb +3 -3
- data/lib/rley/parse_rep/parse_rep_creator.rb +14 -16
- data/lib/rley/parse_rep/parse_tree_builder.rb +4 -4
- data/lib/rley/parse_rep/parse_tree_factory.rb +27 -27
- data/lib/rley/parse_tree_visitor.rb +1 -1
- data/lib/rley/parser/error_reason.rb +4 -5
- data/lib/rley/parser/gfg_chart.rb +118 -26
- data/lib/rley/parser/gfg_parsing.rb +22 -33
- data/lib/rley/parser/parse_entry.rb +25 -31
- data/lib/rley/parser/parse_entry_set.rb +19 -16
- data/lib/rley/parser/parse_entry_tracker.rb +4 -4
- data/lib/rley/parser/parse_tracer.rb +13 -13
- data/lib/rley/parser/parse_walker_factory.rb +23 -28
- data/lib/rley/ptree/non_terminal_node.rb +7 -5
- data/lib/rley/ptree/parse_tree.rb +3 -3
- data/lib/rley/ptree/parse_tree_node.rb +5 -5
- data/lib/rley/ptree/terminal_node.rb +7 -7
- data/lib/rley/rley_error.rb +12 -12
- data/lib/rley/sppf/alternative_node.rb +6 -6
- data/lib/rley/sppf/composite_node.rb +7 -7
- data/lib/rley/sppf/epsilon_node.rb +3 -3
- data/lib/rley/sppf/leaf_node.rb +3 -3
- data/lib/rley/sppf/parse_forest.rb +16 -16
- data/lib/rley/sppf/sppf_node.rb +7 -8
- data/lib/rley/sppf/token_node.rb +3 -3
- data/lib/rley/syntax/{grammar_builder.rb → base_grammar_builder.rb} +61 -23
- data/lib/rley/syntax/grammar.rb +5 -5
- data/lib/rley/syntax/grm_symbol.rb +7 -7
- data/lib/rley/syntax/match_closest.rb +43 -0
- data/lib/rley/syntax/non_terminal.rb +9 -15
- data/lib/rley/syntax/production.rb +16 -10
- data/lib/rley/syntax/symbol_seq.rb +7 -9
- data/lib/rley/syntax/terminal.rb +4 -5
- data/lib/rley/syntax/verbatim_symbol.rb +3 -3
- data/lib/support/base_tokenizer.rb +19 -18
- data/spec/rley/base/dotted_item_spec.rb +2 -2
- data/spec/rley/engine_spec.rb +23 -21
- data/spec/rley/formatter/asciitree_spec.rb +7 -7
- data/spec/rley/formatter/bracket_notation_spec.rb +13 -13
- data/spec/rley/formatter/json_spec.rb +1 -1
- data/spec/rley/gfg/end_vertex_spec.rb +5 -5
- data/spec/rley/gfg/grm_flow_graph_spec.rb +2 -2
- data/spec/rley/gfg/item_vertex_spec.rb +10 -10
- data/spec/rley/gfg/non_terminal_vertex_spec.rb +3 -3
- data/spec/rley/gfg/shortcut_edge_spec.rb +1 -1
- data/spec/rley/gfg/start_vertex_spec.rb +5 -5
- data/spec/rley/gfg/vertex_spec.rb +3 -3
- data/spec/rley/lexical/token_range_spec.rb +16 -16
- data/spec/rley/lexical/token_spec.rb +2 -2
- data/spec/rley/notation/grammar_builder_spec.rb +302 -0
- data/spec/rley/notation/parser_spec.rb +184 -0
- data/spec/rley/notation/tokenizer_spec.rb +370 -0
- data/spec/rley/parse_forest_visitor_spec.rb +165 -163
- data/spec/rley/parse_rep/ambiguous_parse_spec.rb +44 -44
- data/spec/rley/parse_rep/ast_builder_spec.rb +6 -7
- data/spec/rley/parse_rep/cst_builder_spec.rb +5 -5
- data/spec/rley/parse_rep/groucho_spec.rb +24 -26
- data/spec/rley/parse_rep/parse_forest_builder_spec.rb +27 -27
- data/spec/rley/parse_rep/parse_forest_factory_spec.rb +8 -8
- data/spec/rley/parse_rep/parse_tree_factory_spec.rb +3 -3
- data/spec/rley/parse_tree_visitor_spec.rb +10 -8
- data/spec/rley/parser/dangling_else_spec.rb +445 -0
- data/spec/rley/parser/error_reason_spec.rb +6 -6
- data/spec/rley/parser/gfg_earley_parser_spec.rb +120 -12
- data/spec/rley/parser/gfg_parsing_spec.rb +6 -13
- data/spec/rley/parser/parse_entry_spec.rb +19 -19
- data/spec/rley/parser/parse_walker_factory_spec.rb +10 -10
- data/spec/rley/ptree/non_terminal_node_spec.rb +5 -3
- data/spec/rley/ptree/parse_tree_node_spec.rb +4 -4
- data/spec/rley/ptree/terminal_node_spec.rb +6 -6
- data/spec/rley/sppf/alternative_node_spec.rb +6 -6
- data/spec/rley/sppf/non_terminal_node_spec.rb +3 -3
- data/spec/rley/sppf/token_node_spec.rb +4 -4
- data/spec/rley/support/ambiguous_grammar_helper.rb +4 -5
- data/spec/rley/support/grammar_abc_helper.rb +3 -5
- data/spec/rley/support/grammar_ambig01_helper.rb +5 -6
- data/spec/rley/support/grammar_arr_int_helper.rb +5 -6
- data/spec/rley/support/grammar_b_expr_helper.rb +5 -6
- data/spec/rley/support/grammar_int_seq_helper.rb +51 -0
- data/spec/rley/support/grammar_l0_helper.rb +14 -17
- data/spec/rley/support/grammar_pb_helper.rb +8 -7
- data/spec/rley/support/grammar_sppf_helper.rb +3 -3
- data/spec/rley/syntax/{grammar_builder_spec.rb → base_grammar_builder_spec.rb} +35 -16
- data/spec/rley/syntax/grammar_spec.rb +6 -6
- data/spec/rley/syntax/grm_symbol_spec.rb +1 -1
- data/spec/rley/syntax/match_closest_spec.rb +46 -0
- data/spec/rley/syntax/non_terminal_spec.rb +8 -8
- data/spec/rley/syntax/production_spec.rb +17 -13
- data/spec/rley/syntax/symbol_seq_spec.rb +2 -2
- data/spec/rley/syntax/terminal_spec.rb +5 -5
- data/spec/rley/syntax/verbatim_symbol_spec.rb +1 -1
- data/spec/spec_helper.rb +0 -12
- data/spec/support/base_tokenizer_spec.rb +7 -2
- metadata +48 -74
- data/.simplecov +0 -7
- data/lib/rley/parser/parse_state.rb +0 -83
- data/lib/rley/parser/parse_state_tracker.rb +0 -59
- data/lib/rley/parser/state_set.rb +0 -101
- data/spec/rley/parser/parse_state_spec.rb +0 -125
- data/spec/rley/parser/parse_tracer_spec.rb +0 -200
- 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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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::
|
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' =>
|
16
|
+
rule 'simple_expression' => 'simple_expression add_operator term'
|
16
17
|
rule 'term' => 'factor'
|
17
|
-
rule 'term' =>
|
18
|
+
rule 'term' => 'term mul_operator factor'
|
18
19
|
rule 'factor' => 'NUMBER'
|
19
|
-
rule 'factor' =>
|
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
|
-
|
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
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
190
|
-
return exponentiation
|
174
|
+
operands[0]**operands[1]
|
191
175
|
end
|
192
176
|
end # class
|
193
177
|
# End of file
|