rley 0.4.06 → 0.4.07
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +22 -13
- data/.travis.yml +8 -7
- data/CHANGELOG.md +9 -0
- data/README.md +9 -10
- data/examples/NLP/mini_en_demo.rb +7 -7
- data/examples/data_formats/JSON/cli_options.rb +5 -6
- data/examples/data_formats/JSON/{JSON_demo.rb → json_demo.rb} +2 -2
- data/examples/data_formats/JSON/{JSON_grammar.rb → json_grammar.rb} +10 -10
- data/examples/data_formats/JSON/{JSON_lexer.rb → json_lexer.rb} +17 -22
- data/examples/data_formats/JSON/{JSON_parser.rb → json_parser.rb} +2 -2
- data/examples/general/calc/calc_demo.rb +1 -1
- data/examples/general/calc/calc_grammar.rb +5 -5
- data/examples/general/calc/calc_lexer.rb +14 -17
- data/examples/general/calc/calc_parser.rb +2 -2
- data/lib/rley/constants.rb +1 -1
- data/lib/rley/formatter/asciitree.rb +15 -16
- data/lib/rley/formatter/bracket_notation.rb +3 -6
- data/lib/rley/formatter/debug.rb +0 -1
- data/lib/rley/formatter/json.rb +0 -1
- data/lib/rley/gfg/grm_flow_graph.rb +11 -10
- data/lib/rley/parse_forest_visitor.rb +0 -3
- data/lib/rley/parse_tree_visitor.rb +0 -3
- data/lib/rley/parser/error_reason.rb +1 -5
- data/lib/rley/parser/gfg_chart.rb +2 -2
- data/lib/rley/parser/gfg_earley_parser.rb +1 -2
- data/lib/rley/parser/gfg_parsing.rb +3 -7
- data/lib/rley/parser/parse_entry.rb +0 -1
- data/lib/rley/parser/parse_entry_set.rb +15 -16
- data/lib/rley/parser/parse_forest_builder.rb +8 -23
- data/lib/rley/parser/parse_state.rb +1 -1
- data/lib/rley/parser/parse_tree_builder.rb +2 -30
- data/lib/rley/parser/parse_tree_factory.rb +1 -1
- data/lib/rley/parser/parse_walker_factory.rb +3 -6
- data/lib/rley/parser/state_set.rb +0 -1
- data/lib/rley/ptree/parse_tree.rb +0 -1
- data/lib/rley/ptree/terminal_node.rb +4 -1
- data/lib/rley/rley_error.rb +1 -1
- data/lib/rley/sppf/composite_node.rb +0 -1
- data/lib/rley/sppf/parse_forest.rb +0 -1
- data/lib/rley/syntax/grammar.rb +5 -9
- data/lib/rley/syntax/grammar_builder.rb +8 -11
- data/lib/rley/syntax/grm_symbol.rb +0 -1
- data/lib/rley/syntax/production.rb +5 -4
- data/lib/rley/tokens/token_range.rb +0 -1
- data/spec/rley/formatter/bracket_notation_spec.rb +3 -1
- data/spec/rley/gfg/grm_flow_graph_spec.rb +15 -46
- data/spec/rley/gfg/item_vertex_spec.rb +1 -1
- data/spec/rley/parse_forest_visitor_spec.rb +1 -1
- data/spec/rley/parse_tree_visitor_spec.rb +2 -2
- data/spec/rley/parser/error_reason_spec.rb +19 -14
- data/spec/rley/parser/gfg_chart_spec.rb +1 -1
- data/spec/rley/parser/gfg_earley_parser_spec.rb +15 -15
- data/spec/rley/parser/gfg_parsing_spec.rb +3 -3
- data/spec/rley/parser/groucho_spec.rb +6 -7
- data/spec/rley/parser/parse_forest_builder_spec.rb +5 -5
- data/spec/rley/parser/parse_forest_factory_spec.rb +5 -5
- data/spec/rley/parser/parse_state_spec.rb +8 -0
- data/spec/rley/parser/parse_tracer_spec.rb +1 -1
- data/spec/rley/parser/parse_tree_builder_spec.rb +26 -29
- data/spec/rley/parser/parse_tree_factory_spec.rb +5 -5
- data/spec/rley/parser/parse_walker_factory_spec.rb +5 -5
- data/spec/rley/ptree/parse_tree_node_spec.rb +2 -2
- data/spec/rley/ptree/terminal_node_spec.rb +1 -1
- data/spec/rley/support/ambiguous_grammar_helper.rb +1 -1
- data/spec/rley/support/expectation_helper.rb +0 -1
- data/spec/rley/support/grammar_abc_helper.rb +1 -1
- data/spec/rley/support/grammar_ambig01_helper.rb +2 -3
- data/spec/rley/support/grammar_b_expr_helper.rb +2 -2
- data/spec/rley/support/grammar_l0_helper.rb +7 -8
- data/spec/rley/support/grammar_pb_helper.rb +3 -4
- data/spec/rley/support/grammar_sppf_helper.rb +4 -4
- data/spec/rley/syntax/grammar_builder_spec.rb +5 -4
- data/spec/rley/syntax/grammar_spec.rb +10 -11
- data/spec/rley/syntax/symbol_seq_spec.rb +2 -2
- data/spec/rley/syntax/terminal_spec.rb +1 -1
- metadata +31 -31
@@ -25,10 +25,10 @@ module Rley # This module is used as a namespace
|
|
25
25
|
# @example Building a tiny English grammar
|
26
26
|
# builder = Rley::Syntax::GrammarBuilder.new do
|
27
27
|
# add_terminals('n', 'v', 'adj', 'det')
|
28
|
-
# rule 'S' => %w
|
29
|
-
# rule 'VP' => %w
|
30
|
-
# rule 'NP' => %w
|
31
|
-
# rule 'NP' => %w
|
28
|
+
# rule 'S' => %w[NP VP]
|
29
|
+
# rule 'VP' => %w[v NP]
|
30
|
+
# rule 'NP' => %w[det n]
|
31
|
+
# rule 'NP' => %w[adj NP]
|
32
32
|
# end
|
33
33
|
# tiny_eng = builder.grammar
|
34
34
|
def initialize(&aBlock)
|
@@ -54,7 +54,6 @@ module Rley # This module is used as a namespace
|
|
54
54
|
symbols.merge!(new_symbs)
|
55
55
|
end
|
56
56
|
|
57
|
-
|
58
57
|
# Add a production rule in the grammar given one
|
59
58
|
# key-value pair of the form: String => Array.
|
60
59
|
# Where the key is the name of the non-terminal appearing in the
|
@@ -64,10 +63,10 @@ module Rley # This module is used as a namespace
|
|
64
63
|
# @example Equivalent call syntaxes
|
65
64
|
# builder.add_production('A' => ['a', 'A', 'c'])
|
66
65
|
# builder.rule('A' => ['a', 'A', 'c']) # 'rule' is a synonym
|
67
|
-
# builder.rule('A' => %w
|
68
|
-
# builder.rule 'A' => %w
|
69
|
-
# @param aProductionRepr [Hash{String, Array<String>}]
|
70
|
-
# of a production.
|
66
|
+
# builder.rule('A' => %w[a A c]) # Use %w syntax for Array of String
|
67
|
+
# builder.rule 'A' => %w[a A c] # Call parentheses are optional
|
68
|
+
# @param aProductionRepr [Hash{String, Array<String>}]
|
69
|
+
# A Hash-based representation of a production.
|
71
70
|
# @return [void]
|
72
71
|
def add_production(aProductionRepr)
|
73
72
|
aProductionRepr.each_pair do |(lhs_name, rhs_repr)|
|
@@ -138,7 +137,6 @@ module Rley # This module is used as a namespace
|
|
138
137
|
return symbs
|
139
138
|
end
|
140
139
|
|
141
|
-
|
142
140
|
# If the argument is already a grammar symbol object then it is
|
143
141
|
# returned as is. Otherwise, the argument is treated as a name
|
144
142
|
# for a new instance of the given class.
|
@@ -165,7 +163,6 @@ module Rley # This module is used as a namespace
|
|
165
163
|
end
|
166
164
|
return symbols[aSymbolName]
|
167
165
|
end
|
168
|
-
|
169
166
|
end # class
|
170
167
|
end # module
|
171
168
|
end # module
|
@@ -10,14 +10,15 @@ module Rley # This module is used as a namespace
|
|
10
10
|
# in other words every occurrence of the LHS can be substituted to
|
11
11
|
# corresponding RHS.
|
12
12
|
class Production
|
13
|
-
# The right-hand side (rhs)
|
13
|
+
# @return [SymbolSeq] The right-hand side (rhs).
|
14
14
|
attr_reader(:rhs)
|
15
15
|
|
16
|
-
# The left-hand side of the rule.
|
16
|
+
# @return [NonTerminal] The left-hand side of the rule.
|
17
17
|
attr_reader(:lhs)
|
18
18
|
|
19
|
-
# A production is generative when all of its
|
20
|
-
# can each generate/derive
|
19
|
+
# @return [Boolean ]A production is generative when all of its
|
20
|
+
# rhs members are generative (that is, they can each generate/derive
|
21
|
+
# a non-empty string of terminals).
|
21
22
|
attr_writer(:generative)
|
22
23
|
|
23
24
|
# Provide common alternate names to lhs and rhs accessors
|
@@ -61,7 +61,9 @@ module Rley # Re-open the module to get rid of qualified names
|
|
61
61
|
|
62
62
|
context 'Standard creation & initialization:' do
|
63
63
|
it 'should be initialized with an IO argument' do
|
64
|
-
expect
|
64
|
+
expect do
|
65
|
+
BracketNotation.new(StringIO.new('', 'w'))
|
66
|
+
end.not_to raise_error
|
65
67
|
end
|
66
68
|
|
67
69
|
it 'should know its output destination' do
|
@@ -165,7 +165,7 @@ module Rley # Open this namespace to avoid module qualifier prefixes
|
|
165
165
|
builder.add_production('S' => 'B')
|
166
166
|
builder.add_production('A' => 'a')
|
167
167
|
# There is no edge between .B and B => B . b => non-generative
|
168
|
-
builder.add_production('B' => %w
|
168
|
+
builder.add_production('B' => %w[B b])
|
169
169
|
|
170
170
|
# Non-terminal symbol C is unreachable
|
171
171
|
builder.add_production('C' => 'c')
|
@@ -181,18 +181,18 @@ module Rley # Open this namespace to avoid module qualifier prefixes
|
|
181
181
|
end
|
182
182
|
|
183
183
|
expected = [
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
184
|
+
'.S',
|
185
|
+
'S => . A',
|
186
|
+
'.A',
|
187
|
+
'A => . a A c',
|
188
|
+
'A => a . A c',
|
189
|
+
'A => a A . c',
|
190
|
+
'A => a A c .',
|
191
|
+
'A.',
|
192
|
+
'A => . b',
|
193
|
+
'A => b .',
|
194
|
+
'S.'
|
195
|
+
]
|
196
196
|
expect(result).to eq(expected)
|
197
197
|
end
|
198
198
|
|
@@ -214,42 +214,11 @@ module Rley # Open this namespace to avoid module qualifier prefixes
|
|
214
214
|
expect(nterm).not_to be_undefined
|
215
215
|
end
|
216
216
|
|
217
|
-
unreachable = grammar.non_terminals.select
|
218
|
-
nterm.unreachable?
|
219
|
-
end
|
217
|
+
unreachable = grammar.non_terminals.select(&:unreachable?)
|
220
218
|
expect(unreachable.size).to eq(1)
|
221
219
|
expect(unreachable[0].name).to eq('C')
|
222
220
|
end
|
223
|
-
end # context
|
224
|
-
|
225
|
-
=begin
|
226
|
-
context 'Grammar without undefined symbols:' do
|
227
|
-
it 'should mark all its nonterminals as not undefined' do
|
228
|
-
nonterms = subject.non_terminals
|
229
|
-
nonterms.each do |nterm|
|
230
|
-
expect(nterm).not_to be_undefined
|
231
|
-
end
|
232
|
-
end
|
233
|
-
end # context
|
234
|
-
|
235
|
-
context 'Grammar with undefined symbols:' do
|
236
|
-
subject do
|
237
|
-
productions = [prod_S, prod_A1, prod_A2, prod_A3]
|
238
|
-
Grammar.new(productions)
|
239
|
-
end
|
240
|
-
|
241
|
-
it 'should detect its nonterminals that are undefined' do
|
242
|
-
nonterms = subject.non_terminals
|
243
|
-
culprits = nonterms.select do |nterm|
|
244
|
-
nterm.undefined?
|
245
|
-
end
|
246
|
-
|
247
|
-
expect(culprits.size).to eq(1)
|
248
|
-
expect(culprits[0]).to eq(nt_C)
|
249
|
-
end
|
250
|
-
end # context
|
251
|
-
=end
|
252
|
-
|
221
|
+
end # context
|
253
222
|
end # describe
|
254
223
|
end # module
|
255
224
|
end # module
|
@@ -114,7 +114,7 @@ module Rley # Open this namespace to avoid module qualifier prefixes
|
|
114
114
|
it 'should reject an invalid shortcut edge' do
|
115
115
|
err = StandardError
|
116
116
|
err_msg = 'Invalid shortcut argument'
|
117
|
-
expect { subject.shortcut = 'invalid'}.to raise_error(err, err_msg)
|
117
|
+
expect { subject.shortcut = 'invalid' }.to raise_error(err, err_msg)
|
118
118
|
end
|
119
119
|
end # context
|
120
120
|
end # describe
|
@@ -238,8 +238,8 @@ module Rley # Open this namespace to avoid module qualifier prefixes
|
|
238
238
|
expectations = [
|
239
239
|
[:before_ptree, [grm_abc_ptree1]],
|
240
240
|
# TODO: fix this test
|
241
|
-
#[:before_subnodes, [root, children]],
|
242
|
-
#[:before_non_terminal, [root]],
|
241
|
+
# [:before_subnodes, [root, children]],
|
242
|
+
# [:before_non_terminal, [root]],
|
243
243
|
|
244
244
|
# [:before_non_terminal, [big_a_1]],
|
245
245
|
# [:before_subnodes, [big_a_1, big_a_1_children]],
|
@@ -36,15 +36,17 @@ module Rley # Open this namespace to avoid module qualifier prefixes
|
|
36
36
|
describe ExpectationNotMet do
|
37
37
|
let(:err_token) { double('fake-token') }
|
38
38
|
let(:terminals) do
|
39
|
-
[
|
39
|
+
%w[PLUS LPAREN].map { |name| Syntax::Terminal.new(name) }
|
40
40
|
end
|
41
41
|
|
42
42
|
# Default instantiation rule
|
43
|
-
subject { ExpectationNotMet.new(3, err_token, terminals)
|
43
|
+
subject { ExpectationNotMet.new(3, err_token, terminals) }
|
44
44
|
|
45
45
|
context 'Initialization:' do
|
46
46
|
it 'should be created with arguments' do
|
47
|
-
expect
|
47
|
+
expect do
|
48
|
+
ExpectationNotMet.new(3, err_token, terminals)
|
49
|
+
end.not_to raise_error
|
48
50
|
end
|
49
51
|
|
50
52
|
it 'should know the error position' do
|
@@ -57,21 +59,22 @@ module Rley # Open this namespace to avoid module qualifier prefixes
|
|
57
59
|
end # context
|
58
60
|
end # describe
|
59
61
|
|
60
|
-
|
61
62
|
describe UnexpectedToken do
|
62
|
-
let(:err_lexeme) { '-'}
|
63
|
+
let(:err_lexeme) { '-' }
|
63
64
|
let(:err_terminal) { Syntax::Terminal.new('MINUS') }
|
64
65
|
let(:err_token) { Tokens::Token.new(err_lexeme, err_terminal) }
|
65
66
|
let(:terminals) do
|
66
|
-
[
|
67
|
+
%w[PLUS LPAREN].map { |name| Syntax::Terminal.new(name) }
|
67
68
|
end
|
68
69
|
|
69
70
|
# Default instantiation rule
|
70
|
-
subject { UnexpectedToken.new(3, err_token, terminals)
|
71
|
+
subject { UnexpectedToken.new(3, err_token, terminals) }
|
71
72
|
|
72
73
|
context 'Initialization:' do
|
73
74
|
it 'should be created with arguments' do
|
74
|
-
expect
|
75
|
+
expect do
|
76
|
+
UnexpectedToken.new(3, err_token, terminals)
|
77
|
+
end.not_to raise_error
|
75
78
|
end
|
76
79
|
end # context
|
77
80
|
|
@@ -85,22 +88,24 @@ MSG_END
|
|
85
88
|
expect(subject.message).to eq(text.chomp)
|
86
89
|
end
|
87
90
|
end # context
|
88
|
-
end #describe
|
91
|
+
end # describe
|
89
92
|
|
90
93
|
describe PrematureInputEnd do
|
91
|
-
let(:err_lexeme) { '+'}
|
94
|
+
let(:err_lexeme) { '+' }
|
92
95
|
let(:err_terminal) { Syntax::Terminal.new('PLUS') }
|
93
96
|
let(:err_token) { Tokens::Token.new(err_lexeme, err_terminal) }
|
94
97
|
let(:terminals) do
|
95
|
-
[
|
98
|
+
%w[INT LPAREN].map { |name| Syntax::Terminal.new(name) }
|
96
99
|
end
|
97
100
|
|
98
101
|
# Default instantiation rule
|
99
|
-
subject { PrematureInputEnd.new(3, err_token, terminals)
|
102
|
+
subject { PrematureInputEnd.new(3, err_token, terminals) }
|
100
103
|
|
101
104
|
context 'Initialization:' do
|
102
105
|
it 'should be created with arguments' do
|
103
|
-
expect
|
106
|
+
expect do
|
107
|
+
PrematureInputEnd.new(3, err_token, terminals)
|
108
|
+
end.not_to raise_error
|
104
109
|
end
|
105
110
|
end # context
|
106
111
|
|
@@ -117,4 +122,4 @@ MSG_END
|
|
117
122
|
end # describe
|
118
123
|
end # module
|
119
124
|
end # module
|
120
|
-
# End of file
|
125
|
+
# End of file
|
@@ -33,7 +33,7 @@ module Rley # Open this namespace to avoid module qualifier prefixes
|
|
33
33
|
end
|
34
34
|
|
35
35
|
let(:grm1_tokens) do
|
36
|
-
build_token_sequence(%w
|
36
|
+
build_token_sequence(%w[a a b c c], grammar_abc)
|
37
37
|
end
|
38
38
|
|
39
39
|
|
@@ -116,7 +116,7 @@ module Rley # Open this namespace to avoid module qualifier prefixes
|
|
116
116
|
'A => . b | 0' # start rule
|
117
117
|
]
|
118
118
|
compare_entry_texts(parse_result.chart[0], expected)
|
119
|
-
expected_terminals(parse_result.chart[0], %w
|
119
|
+
expected_terminals(parse_result.chart[0], %w[a b])
|
120
120
|
|
121
121
|
######################
|
122
122
|
# Expectation chart[1]:
|
@@ -129,7 +129,7 @@ module Rley # Open this namespace to avoid module qualifier prefixes
|
|
129
129
|
entry_set_1 = parse_result.chart[1]
|
130
130
|
expect(entry_set_1.entries.size).to eq(4)
|
131
131
|
compare_entry_texts(entry_set_1, expected)
|
132
|
-
expected_terminals(parse_result.chart[1], %w
|
132
|
+
expected_terminals(parse_result.chart[1], %w[a b])
|
133
133
|
|
134
134
|
######################
|
135
135
|
# Expectation chart[2]:
|
@@ -142,7 +142,7 @@ module Rley # Open this namespace to avoid module qualifier prefixes
|
|
142
142
|
entry_set_2 = parse_result.chart[2]
|
143
143
|
expect(entry_set_2.entries.size).to eq(4)
|
144
144
|
compare_entry_texts(entry_set_2, expected)
|
145
|
-
expected_terminals(parse_result.chart[2], %w
|
145
|
+
expected_terminals(parse_result.chart[2], %w[a b])
|
146
146
|
|
147
147
|
######################
|
148
148
|
# Expectation chart[3]:
|
@@ -154,7 +154,7 @@ module Rley # Open this namespace to avoid module qualifier prefixes
|
|
154
154
|
entry_set_3 = parse_result.chart[3]
|
155
155
|
expect(entry_set_3.entries.size).to eq(3)
|
156
156
|
compare_entry_texts(entry_set_3, expected)
|
157
|
-
expected_terminals(parse_result.chart[3],
|
157
|
+
expected_terminals(parse_result.chart[3], ['c'])
|
158
158
|
|
159
159
|
|
160
160
|
######################
|
@@ -167,7 +167,7 @@ module Rley # Open this namespace to avoid module qualifier prefixes
|
|
167
167
|
entry_set_4 = parse_result.chart[4]
|
168
168
|
expect(entry_set_4.entries.size).to eq(3)
|
169
169
|
compare_entry_texts(entry_set_4, expected)
|
170
|
-
expected_terminals(parse_result.chart[4],
|
170
|
+
expected_terminals(parse_result.chart[4], ['c'])
|
171
171
|
|
172
172
|
######################
|
173
173
|
# Expectation chart[5]:
|
@@ -286,7 +286,7 @@ module Rley # Open this namespace to avoid module qualifier prefixes
|
|
286
286
|
|
287
287
|
builder = Syntax::GrammarBuilder.new
|
288
288
|
builder.add_terminals(t_x)
|
289
|
-
builder.add_production('Ss' => %w
|
289
|
+
builder.add_production('Ss' => %w[A A x])
|
290
290
|
builder.add_production('A' => [])
|
291
291
|
tokens = [ Tokens::Token.new('x', t_x) ]
|
292
292
|
|
@@ -331,8 +331,8 @@ module Rley # Open this namespace to avoid module qualifier prefixes
|
|
331
331
|
builder = Syntax::GrammarBuilder.new do
|
332
332
|
add_terminals(t_int, t_plus, t_star)
|
333
333
|
rule 'P' => 'S'
|
334
|
-
rule 'S' => %w
|
335
|
-
rule 'S' => %w
|
334
|
+
rule 'S' => %w[S + S]
|
335
|
+
rule 'S' => %w[S * S]
|
336
336
|
rule 'S' => 'L'
|
337
337
|
rule 'L' => 'integer'
|
338
338
|
end
|
@@ -555,14 +555,14 @@ module Rley # Open this namespace to avoid module qualifier prefixes
|
|
555
555
|
|
556
556
|
it 'should parse an invalid simple input' do
|
557
557
|
# Parse an erroneous input (b is missing)
|
558
|
-
wrong = build_token_sequence(%w
|
558
|
+
wrong = build_token_sequence(%w[a a c c], grammar_abc)
|
559
559
|
parse_result = subject.parse(wrong)
|
560
560
|
expect(parse_result.success?).to eq(false)
|
561
561
|
err_msg = <<-MSG
|
562
562
|
Syntax error at or near token 3 >>>c<<<
|
563
563
|
Expected one of: ['a', 'b'], found a 'c' instead.
|
564
564
|
MSG
|
565
|
-
expect(parse_result.failure_reason.message).to eq(err_msg.chomp)
|
565
|
+
expect(parse_result.failure_reason.message).to eq(err_msg.chomp)
|
566
566
|
end
|
567
567
|
|
568
568
|
it 'should report error when no input provided but was required' do
|
@@ -729,7 +729,7 @@ MSG
|
|
729
729
|
builder = Syntax::GrammarBuilder.new do
|
730
730
|
add_terminals(t_a, t_star, t_slash)
|
731
731
|
rule 'Z' => 'E'
|
732
|
-
rule 'E' => %w
|
732
|
+
rule 'E' => %w[E Q F]
|
733
733
|
rule 'E' => 'F'
|
734
734
|
rule 'F' => t_a
|
735
735
|
rule 'Q' => t_star
|
@@ -737,7 +737,7 @@ MSG
|
|
737
737
|
rule 'Q' => [] # Empty production
|
738
738
|
end
|
739
739
|
|
740
|
-
tokens = build_token_sequence(%w
|
740
|
+
tokens = build_token_sequence(%w[a a / a], builder.grammar)
|
741
741
|
instance = GFGEarleyParser.new(builder.grammar)
|
742
742
|
expect { instance.parse(tokens) }.not_to raise_error
|
743
743
|
parse_result = instance.parse(tokens)
|
@@ -843,10 +843,10 @@ MSG
|
|
843
843
|
# input tokens
|
844
844
|
builder = Syntax::GrammarBuilder.new
|
845
845
|
builder.add_terminals('a')
|
846
|
-
builder.add_production('S' => %w
|
846
|
+
builder.add_production('S' => %w[a S])
|
847
847
|
builder.add_production('S' => [])
|
848
848
|
grammar = builder.grammar
|
849
|
-
tokens = build_token_sequence(%w
|
849
|
+
tokens = build_token_sequence(%w[a a a a], grammar)
|
850
850
|
|
851
851
|
instance = GFGEarleyParser.new(grammar)
|
852
852
|
parse_result = instance.parse(tokens)
|
@@ -42,10 +42,10 @@ module Rley # Open this namespace to avoid module qualifier prefixes
|
|
42
42
|
end
|
43
43
|
|
44
44
|
let(:grm1_tokens) do
|
45
|
-
build_token_sequence(%w
|
45
|
+
build_token_sequence(%w[a a b c c], grm1)
|
46
46
|
end
|
47
47
|
|
48
|
-
let(:grm1_token_b) { build_token_sequence(
|
48
|
+
let(:grm1_token_b) { build_token_sequence(['b'], grm1) }
|
49
49
|
|
50
50
|
# Helper method. Create an array of dotted items
|
51
51
|
# from the abc grammar
|
@@ -297,7 +297,7 @@ SNIPPET
|
|
297
297
|
end
|
298
298
|
|
299
299
|
let(:token_seq1) do
|
300
|
-
%w
|
300
|
+
%w[a a b c c].map do |letter|
|
301
301
|
Tokens::Token.new(letter, sample_grammar1.name2symbol[letter])
|
302
302
|
end
|
303
303
|
end
|