rley 0.1.08 → 0.1.09
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +8 -8
- data/.rubocop.yml +81 -74
- data/CHANGELOG.md +4 -0
- data/Rakefile +4 -6
- data/examples/grammars/grammar_L0.rb +31 -31
- data/examples/grammars/grammar_abc.rb +26 -26
- data/lib/rley/constants.rb +1 -1
- data/lib/rley/formatter/base_formatter.rb +1 -3
- data/lib/rley/formatter/debug.rb +1 -3
- data/lib/rley/formatter/json.rb +2 -5
- data/lib/rley/parse_tree_visitor.rb +0 -2
- data/lib/rley/parser/dotted_item.rb +3 -1
- data/lib/rley/parser/earley_parser.rb +4 -4
- data/lib/rley/parser/parsing.rb +10 -9
- data/lib/rley/parser/state_set.rb +1 -3
- data/lib/rley/ptree/non_terminal_node.rb +1 -1
- data/lib/rley/ptree/parse_tree.rb +32 -34
- data/lib/rley/ptree/parse_tree_node.rb +1 -3
- data/lib/rley/ptree/terminal_node.rb +1 -2
- data/lib/rley/ptree/token_range.rb +14 -14
- data/spec/rley/formatter/debug_spec.rb +65 -68
- data/spec/rley/formatter/json_spec.rb +69 -72
- data/spec/rley/parse_tree_visitor_spec.rb +5 -7
- data/spec/rley/parser/chart_spec.rb +0 -4
- data/spec/rley/parser/dotted_item_spec.rb +0 -3
- data/spec/rley/parser/earley_parser_spec.rb +0 -1
- data/spec/rley/parser/parse_state_spec.rb +0 -5
- data/spec/rley/parser/parsing_spec.rb +0 -3
- data/spec/rley/parser/state_set_spec.rb +0 -4
- data/spec/rley/parser/token_spec.rb +0 -4
- data/spec/rley/ptree/non_terminal_node_spec.rb +0 -1
- data/spec/rley/ptree/parse_tree_node_spec.rb +4 -4
- data/spec/rley/ptree/parse_tree_spec.rb +2 -3
- data/spec/rley/ptree/token_range_spec.rb +16 -17
- data/spec/rley/support/grammar_abc_helper.rb +0 -2
- data/spec/rley/syntax/grammar_builder_spec.rb +1 -4
- data/spec/rley/syntax/grammar_spec.rb +0 -9
- data/spec/rley/syntax/grm_symbol_spec.rb +0 -1
- data/spec/rley/syntax/literal_spec.rb +0 -1
- data/spec/rley/syntax/non_terminal_spec.rb +0 -1
- data/spec/rley/syntax/production_spec.rb +0 -2
- data/spec/rley/syntax/symbol_seq_spec.rb +0 -1
- data/spec/rley/syntax/terminal_spec.rb +0 -1
- data/spec/rley/syntax/verbatim_symbol_spec.rb +0 -1
- metadata +2 -2
@@ -57,7 +57,6 @@ module Rley # Open this namespace to avoid module qualifier prefixes
|
|
57
57
|
|
58
58
|
|
59
59
|
context 'Standard creation & initialization:' do
|
60
|
-
|
61
60
|
it 'should be initialized with a parse tree argument' do
|
62
61
|
expect { ParseTreeVisitor.new(grm_abc_ptree1) }.not_to raise_error
|
63
62
|
end
|
@@ -95,7 +94,6 @@ module Rley # Open this namespace to avoid module qualifier prefixes
|
|
95
94
|
subject.unsubscribe(listener1)
|
96
95
|
expect(subject.subscribers).to be_empty
|
97
96
|
end
|
98
|
-
|
99
97
|
end # context
|
100
98
|
|
101
99
|
|
@@ -136,7 +134,8 @@ module Rley # Open this namespace to avoid module qualifier prefixes
|
|
136
134
|
it 'should react to the visit_children message' do
|
137
135
|
# Notify subscribers when start the visit of children nodes
|
138
136
|
children = nterm_node.children
|
139
|
-
|
137
|
+
args = [nterm_node, children]
|
138
|
+
expect(listener1).to receive(:before_children).with(*args)
|
140
139
|
expect(listener1).to receive(:before_terminal).with(children[0])
|
141
140
|
expect(listener1).to receive(:after_terminal).with(children[0])
|
142
141
|
expect(listener1).to receive(:after_children).with(nterm_node, children)
|
@@ -185,7 +184,7 @@ module Rley # Open this namespace to avoid module qualifier prefixes
|
|
185
184
|
[:before_ptree, [grm_abc_ptree1]],
|
186
185
|
[:before_non_terminal, [root]],
|
187
186
|
[:before_children, [root, children]],
|
188
|
-
[:before_non_terminal
|
187
|
+
[:before_non_terminal, [big_a_1]],
|
189
188
|
[:before_children, [big_a_1, big_a_1_children]],
|
190
189
|
[:before_terminal, [big_a_1_children[0]]],
|
191
190
|
[:after_terminal, [big_a_1_children[0]]],
|
@@ -204,8 +203,8 @@ module Rley # Open this namespace to avoid module qualifier prefixes
|
|
204
203
|
[:before_terminal, [big_a_1_children[2]]],
|
205
204
|
[:after_terminal, [big_a_1_children[2]]],
|
206
205
|
[:after_children, [big_a_1, big_a_1_children]],
|
207
|
-
[:after_children
|
208
|
-
[:after_ptree
|
206
|
+
[:after_children, [root, children]],
|
207
|
+
[:after_ptree, [grm_abc_ptree1]]
|
209
208
|
]
|
210
209
|
expectations.each do |(msg, args)|
|
211
210
|
allow(listener1).to receive(msg).with(*args).ordered
|
@@ -214,7 +213,6 @@ module Rley # Open this namespace to avoid module qualifier prefixes
|
|
214
213
|
# Here we go...
|
215
214
|
subject.start
|
216
215
|
end
|
217
|
-
|
218
216
|
end # context
|
219
217
|
end # describe
|
220
218
|
end # module
|
@@ -7,12 +7,10 @@ require_relative '../../../lib/rley/parser/chart'
|
|
7
7
|
module Rley # Open this namespace to avoid module qualifier prefixes
|
8
8
|
module Parser # Open this namespace to avoid module qualifier prefixes
|
9
9
|
describe Chart do
|
10
|
-
|
11
10
|
let(:count_token) { 20 }
|
12
11
|
let(:dotted_rule) { double('fake-dotted-item') }
|
13
12
|
|
14
13
|
context 'Initialization:' do
|
15
|
-
|
16
14
|
# Default instantiation rule
|
17
15
|
subject { Chart.new(dotted_rule, count_token) }
|
18
16
|
|
@@ -35,9 +33,7 @@ module Rley # Open this namespace to avoid module qualifier prefixes
|
|
35
33
|
it 'should the start dotted rule' do
|
36
34
|
expect(subject.start_dotted_rule).to eq(dotted_rule)
|
37
35
|
end
|
38
|
-
|
39
36
|
end # context
|
40
|
-
|
41
37
|
end # describe
|
42
38
|
end # module
|
43
39
|
end # module
|
@@ -10,7 +10,6 @@ require_relative '../../../lib/rley/parser/dotted_item'
|
|
10
10
|
module Rley # Open this namespace to avoid module qualifier prefixes
|
11
11
|
module Parser # Open this namespace to avoid module qualifier prefixes
|
12
12
|
describe DottedItem do
|
13
|
-
|
14
13
|
# Factory method. Builds a production with given left-hand side (LHS)
|
15
14
|
# and given RHS (right-hand side)
|
16
15
|
def build_prod(theLHS, *theRHSSymbols)
|
@@ -65,7 +64,6 @@ module Rley # Open this namespace to avoid module qualifier prefixes
|
|
65
64
|
instance4 = DottedItem.new(build_prod(nt_sentence), 0)
|
66
65
|
expect(instance4.position).to eq(-2)
|
67
66
|
end
|
68
|
-
|
69
67
|
end # context
|
70
68
|
|
71
69
|
context 'Provided service:' do
|
@@ -128,7 +126,6 @@ module Rley # Open this namespace to avoid module qualifier prefixes
|
|
128
126
|
expect(subject.to_s).to eq(expectation)
|
129
127
|
end
|
130
128
|
end
|
131
|
-
|
132
129
|
end # describe
|
133
130
|
end # module
|
134
131
|
end # module
|
@@ -11,7 +11,6 @@ require_relative '../../../lib/rley/parser/parse_state'
|
|
11
11
|
module Rley # Open this namespace to avoid module qualifier prefixes
|
12
12
|
module Parser # Open this namespace to avoid module qualifier prefixes
|
13
13
|
describe ParseState do
|
14
|
-
|
15
14
|
let(:t_a) { Syntax::Terminal.new('A') }
|
16
15
|
let(:t_b) { Syntax::Terminal.new('B') }
|
17
16
|
let(:t_c) { Syntax::Terminal.new('C') }
|
@@ -37,7 +36,6 @@ module Rley # Open this namespace to avoid module qualifier prefixes
|
|
37
36
|
subject { ParseState.new(dotted_rule, origin_val) }
|
38
37
|
|
39
38
|
context 'Initialization:' do
|
40
|
-
|
41
39
|
it 'should be created with a dotted item and a origin position' do
|
42
40
|
args = [dotted_rule, origin_val]
|
43
41
|
expect { ParseState.new(*args) }.not_to raise_error
|
@@ -56,8 +54,6 @@ module Rley # Open this namespace to avoid module qualifier prefixes
|
|
56
54
|
it 'should know the origin value' do
|
57
55
|
expect(subject.origin).to eq(origin_val)
|
58
56
|
end
|
59
|
-
|
60
|
-
|
61
57
|
end # context
|
62
58
|
|
63
59
|
context 'Provided services:' do
|
@@ -107,7 +103,6 @@ module Rley # Open this namespace to avoid module qualifier prefixes
|
|
107
103
|
expect(subject.to_s).to eq(expected)
|
108
104
|
end
|
109
105
|
end # context
|
110
|
-
|
111
106
|
end # describe
|
112
107
|
end # module
|
113
108
|
end # module
|
@@ -13,7 +13,6 @@ require_relative '../../../lib/rley/parser/parsing'
|
|
13
13
|
module Rley # Open this namespace to avoid module qualifier prefixes
|
14
14
|
module Parser # Open this namespace to avoid module qualifier prefixes
|
15
15
|
describe Parsing do
|
16
|
-
|
17
16
|
# Grammar 1: A very simple language
|
18
17
|
# S ::= A.
|
19
18
|
# A ::= "a" A "c".
|
@@ -47,7 +46,6 @@ module Rley # Open this namespace to avoid module qualifier prefixes
|
|
47
46
|
subject { Parsing.new(start_dotted_rule, grm1_tokens) }
|
48
47
|
|
49
48
|
context 'Initialization:' do
|
50
|
-
|
51
49
|
it 'should be created with list of tokens and start dotted rule' do
|
52
50
|
start_rule = start_dotted_rule
|
53
51
|
tokens = grm1_tokens
|
@@ -61,7 +59,6 @@ module Rley # Open this namespace to avoid module qualifier prefixes
|
|
61
59
|
it 'should know its chart object' do
|
62
60
|
expect(subject.chart).to be_kind_of(Chart)
|
63
61
|
end
|
64
|
-
|
65
62
|
end # context
|
66
63
|
|
67
64
|
context 'Parsing:' do
|
@@ -14,14 +14,12 @@ module Rley # Open this namespace to avoid module qualifier prefixes
|
|
14
14
|
let(:state2) { ParseState.new(dotted_rule2, 5) }
|
15
15
|
|
16
16
|
context 'Initialization:' do
|
17
|
-
|
18
17
|
it 'should be created without argument' do
|
19
18
|
expect { StateSet.new }.not_to raise_error
|
20
19
|
end
|
21
20
|
end # context
|
22
21
|
|
23
22
|
context 'Provided services:' do
|
24
|
-
|
25
23
|
it 'should push a state' do
|
26
24
|
expect(subject.states).to be_empty
|
27
25
|
expect { subject.push_state(state1) }.not_to raise_error
|
@@ -80,9 +78,7 @@ module Rley # Open this namespace to avoid module qualifier prefixes
|
|
80
78
|
err = StandardError
|
81
79
|
expect { subject.predecessor_state(state1) }.to raise_error(err)
|
82
80
|
end
|
83
|
-
|
84
81
|
end # context
|
85
|
-
|
86
82
|
end # describe
|
87
83
|
end # module
|
88
84
|
end # module
|
@@ -8,13 +8,10 @@ require_relative '../../../lib/rley/parser/token'
|
|
8
8
|
module Rley # Open this namespace to avoid module qualifier prefixes
|
9
9
|
module Parser # Open this namespace to avoid module qualifier prefixes
|
10
10
|
describe Token do
|
11
|
-
|
12
11
|
let(:lexeme) { '"some text"' }
|
13
12
|
let(:sample_terminal) { Syntax::Terminal.new('if') }
|
14
13
|
|
15
14
|
context 'Initialization:' do
|
16
|
-
|
17
|
-
|
18
15
|
# Default instantiation rule
|
19
16
|
subject { Token.new(lexeme, sample_terminal) }
|
20
17
|
|
@@ -30,7 +27,6 @@ module Rley # Open this namespace to avoid module qualifier prefixes
|
|
30
27
|
expect(subject.terminal).to eq(sample_terminal)
|
31
28
|
end
|
32
29
|
end # context
|
33
|
-
|
34
30
|
end # describe
|
35
31
|
end # module
|
36
32
|
end # module
|
@@ -7,24 +7,24 @@ module Rley # Open this namespace to avoid module qualifier prefixes
|
|
7
7
|
module PTree # Open this namespace to avoid module qualifier prefixes
|
8
8
|
describe ParseTreeNode do
|
9
9
|
let(:sample_symbol) { double('fake-symbol') }
|
10
|
-
let(:sample_range) { {low: 0, high: 5} }
|
10
|
+
let(:sample_range) { { low: 0, high: 5 } }
|
11
11
|
|
12
12
|
subject { ParseTreeNode.new(sample_symbol, sample_range) }
|
13
13
|
|
14
14
|
context 'Initialization:' do
|
15
15
|
it 'should be created with a symbol and a range' do
|
16
|
-
|
16
|
+
args = [ sample_symbol, sample_range ]
|
17
|
+
expect { ParseTreeNode.new(*args) }.not_to raise_error
|
17
18
|
end
|
18
19
|
|
19
20
|
it 'should know its symbol' do
|
20
21
|
expect(subject.symbol).to eq(sample_symbol)
|
21
22
|
end
|
22
23
|
|
23
|
-
it
|
24
|
+
it 'should know its range' do
|
24
25
|
expect(subject.range).to eq(sample_range)
|
25
26
|
end
|
26
27
|
end # context
|
27
|
-
|
28
28
|
end # describe
|
29
29
|
end # module
|
30
30
|
end # module
|
@@ -16,7 +16,7 @@ module Rley # Open this namespace to avoid module qualifier prefixes
|
|
16
16
|
end
|
17
17
|
|
18
18
|
let(:sample_prod) { sample_grammar.rules[0] }
|
19
|
-
let(:sample_range) { {low:0, high:5} }
|
19
|
+
let(:sample_range) { { low: 0, high: 5 } }
|
20
20
|
subject { ParseTree.new(sample_prod, sample_range) }
|
21
21
|
|
22
22
|
context 'Initialization:' do
|
@@ -86,9 +86,8 @@ module Rley # Open this namespace to avoid module qualifier prefixes
|
|
86
86
|
expect(path[4].range.high).to eq(4)
|
87
87
|
end
|
88
88
|
end
|
89
|
-
|
90
89
|
end # describe
|
91
90
|
end # module
|
92
91
|
end # module
|
93
92
|
|
94
|
-
# End of file
|
93
|
+
# End of file
|
@@ -6,8 +6,7 @@ require_relative '../../../lib/rley/ptree/token_range'
|
|
6
6
|
module Rley # Open this namespace to avoid module qualifier prefixes
|
7
7
|
module PTree # Open this namespace to avoid module qualifier prefixes
|
8
8
|
describe TokenRange do
|
9
|
-
|
10
|
-
let(:sample_range) { {low: 0, high: 5} }
|
9
|
+
let(:sample_range) { { low: 0, high: 5 } }
|
11
10
|
|
12
11
|
# Default instantiation rule
|
13
12
|
subject { TokenRange.new(sample_range) }
|
@@ -18,26 +17,26 @@ module Rley # Open this namespace to avoid module qualifier prefixes
|
|
18
17
|
expect { TokenRange.new({}) }.not_to raise_error
|
19
18
|
|
20
19
|
# Low bound provided
|
21
|
-
expect { TokenRange.new(
|
20
|
+
expect { TokenRange.new(low: 0) }.not_to raise_error
|
22
21
|
|
23
22
|
# High bound provided
|
24
|
-
expect { TokenRange.new(
|
23
|
+
expect { TokenRange.new(high: 5) }.not_to raise_error
|
25
24
|
|
26
25
|
# Both bounds provided
|
27
|
-
expect { TokenRange.new(
|
26
|
+
expect { TokenRange.new(low: 0, high: 5) }.not_to raise_error
|
28
27
|
end
|
29
28
|
|
30
29
|
it 'could be created with another TokenRange' do
|
31
30
|
# Low bound provided
|
32
|
-
instance = TokenRange.new(
|
31
|
+
instance = TokenRange.new(low: 0)
|
33
32
|
expect { TokenRange.new(instance) }.not_to raise_error
|
34
33
|
|
35
34
|
# High bound provided
|
36
|
-
instance = TokenRange.new(
|
35
|
+
instance = TokenRange.new(high: 5)
|
37
36
|
expect { TokenRange.new(instance) }.not_to raise_error
|
38
37
|
|
39
38
|
# Both bounds provided
|
40
|
-
instance = TokenRange.new(
|
39
|
+
instance = TokenRange.new(low: 0, high: 5)
|
41
40
|
expect { TokenRange.new(instance) }.not_to raise_error
|
42
41
|
end
|
43
42
|
|
@@ -52,8 +51,9 @@ module Rley # Open this namespace to avoid module qualifier prefixes
|
|
52
51
|
|
53
52
|
context 'Provided services:' do
|
54
53
|
it 'should compare to another range' do
|
55
|
-
|
56
|
-
|
54
|
+
me = subject
|
55
|
+
expect(subject == me).to eq(true)
|
56
|
+
equal = TokenRange.new(low: 0, high: 5)
|
57
57
|
expect(subject == equal).to eq(true)
|
58
58
|
end
|
59
59
|
|
@@ -62,11 +62,11 @@ module Rley # Open this namespace to avoid module qualifier prefixes
|
|
62
62
|
expect(subject).to be_bounded
|
63
63
|
|
64
64
|
# Case: only low bound is set
|
65
|
-
instance = TokenRange.new(
|
65
|
+
instance = TokenRange.new(low: 0)
|
66
66
|
expect(instance).not_to be_bounded
|
67
67
|
|
68
68
|
# Case: only upper bound is set
|
69
|
-
instance = TokenRange.new(
|
69
|
+
instance = TokenRange.new(high: 5)
|
70
70
|
expect(instance).not_to be_bounded
|
71
71
|
|
72
72
|
# No bound is set
|
@@ -75,7 +75,7 @@ module Rley # Open this namespace to avoid module qualifier prefixes
|
|
75
75
|
end
|
76
76
|
|
77
77
|
it 'should assign its open bounds' do
|
78
|
-
some_range = {low: 1, high: 4}
|
78
|
+
some_range = { low: 1, high: 4 }
|
79
79
|
|
80
80
|
###########
|
81
81
|
# Case of bounded token range...
|
@@ -87,7 +87,7 @@ module Rley # Open this namespace to avoid module qualifier prefixes
|
|
87
87
|
|
88
88
|
###########
|
89
89
|
# Case: only low bound is set
|
90
|
-
instance = TokenRange.new(
|
90
|
+
instance = TokenRange.new(low: 0)
|
91
91
|
instance.assign(some_range)
|
92
92
|
|
93
93
|
# Expectation: high is assigned the new value
|
@@ -97,7 +97,7 @@ module Rley # Open this namespace to avoid module qualifier prefixes
|
|
97
97
|
|
98
98
|
###########
|
99
99
|
# Case: only high bound is set
|
100
|
-
instance = TokenRange.new(
|
100
|
+
instance = TokenRange.new(high: 5)
|
101
101
|
instance.assign(some_range)
|
102
102
|
|
103
103
|
# Expectation: low is assigned the new value
|
@@ -116,9 +116,8 @@ module Rley # Open this namespace to avoid module qualifier prefixes
|
|
116
116
|
expect(instance.high).to eq(4)
|
117
117
|
end
|
118
118
|
end
|
119
|
-
|
120
119
|
end # describe
|
121
120
|
end # module
|
122
121
|
end # module
|
123
122
|
|
124
|
-
# End of file
|
123
|
+
# End of file
|
@@ -3,7 +3,6 @@ require_relative '../../../lib/rley/syntax/grammar_builder'
|
|
3
3
|
|
4
4
|
|
5
5
|
module GrammarABCHelper
|
6
|
-
|
7
6
|
# Factory method. Creates a grammar builder for a simple grammar.
|
8
7
|
# (based on example in N. Wirth "Compiler Construction" book, p. 6)
|
9
8
|
def grammar_abc_builder()
|
@@ -16,4 +15,3 @@ module GrammarABCHelper
|
|
16
15
|
return builder
|
17
16
|
end
|
18
17
|
end # module
|
19
|
-
|
@@ -6,7 +6,6 @@ require_relative '../../../lib/rley/syntax/grammar_builder'
|
|
6
6
|
module Rley # Open this namespace to avoid module qualifier prefixes
|
7
7
|
module Syntax # Open this namespace to avoid module qualifier prefixes
|
8
8
|
describe GrammarBuilder do
|
9
|
-
|
10
9
|
context 'Initialization:' do
|
11
10
|
it 'should be created without argument' do
|
12
11
|
expect { GrammarBuilder.new }.not_to raise_error
|
@@ -19,7 +18,6 @@ module Rley # Open this namespace to avoid module qualifier prefixes
|
|
19
18
|
it 'should have no productions at start' do
|
20
19
|
expect(subject.productions).to be_empty
|
21
20
|
end
|
22
|
-
|
23
21
|
end # context
|
24
22
|
|
25
23
|
context 'Adding symbols:' do
|
@@ -156,8 +154,7 @@ module Rley # Open this namespace to avoid module qualifier prefixes
|
|
156
154
|
expect { builder.grammar }.not_to raise_error
|
157
155
|
expect(builder.productions.last).to be_empty
|
158
156
|
end
|
159
|
-
end
|
160
|
-
|
157
|
+
end # context
|
161
158
|
end # describe
|
162
159
|
end # module
|
163
160
|
end # module
|
@@ -10,7 +10,6 @@ require_relative '../../../lib/rley/syntax/grammar'
|
|
10
10
|
module Rley # Open this namespace to avoid module qualifier prefixes
|
11
11
|
module Syntax # Open this namespace to avoid module qualifier prefixes
|
12
12
|
describe Grammar do
|
13
|
-
|
14
13
|
# Factory method. Builds a list of productions
|
15
14
|
# having same lhs and the symbols sequence
|
16
15
|
# in their rhs.
|
@@ -123,7 +122,6 @@ module Rley # Open this namespace to avoid module qualifier prefixes
|
|
123
122
|
end
|
124
123
|
|
125
124
|
context 'Initialization:' do
|
126
|
-
|
127
125
|
it 'should be created with a list of productions' do
|
128
126
|
expect { Grammar.new([prod_S, prod_A1, prod_A2]) }.not_to raise_error
|
129
127
|
end
|
@@ -145,12 +143,6 @@ module Rley # Open this namespace to avoid module qualifier prefixes
|
|
145
143
|
end
|
146
144
|
end # context
|
147
145
|
|
148
|
-
# let(:nt_S) { NonTerminal.new('S') }
|
149
|
-
# let(:nt_A) { NonTerminal.new('A') }
|
150
|
-
# let(:a_) { VerbatimSymbol.new('a') }
|
151
|
-
# let(:b_) { VerbatimSymbol.new('b') }
|
152
|
-
# let(:c_) { VerbatimSymbol.new('c') }
|
153
|
-
|
154
146
|
context 'Provided services:' do
|
155
147
|
it 'should retrieve its symbols from their name' do
|
156
148
|
expect(subject.name2symbol['S']).to eq(nt_S)
|
@@ -187,7 +179,6 @@ module Rley # Open this namespace to avoid module qualifier prefixes
|
|
187
179
|
end
|
188
180
|
|
189
181
|
end # context
|
190
|
-
|
191
182
|
end # describe
|
192
183
|
end # module
|
193
184
|
end # module
|