spec/rley/parser/earley_parser_spec.rb in rley-0.0.11 vs spec/rley/parser/earley_parser_spec.rb in rley-0.0.12
- old
+ new
@@ -1,10 +1,11 @@
require_relative '../../spec_helper'
require_relative '../../../lib/rley/syntax/verbatim_symbol'
require_relative '../../../lib/rley/syntax/non_terminal'
require_relative '../../../lib/rley/syntax/production'
+require_relative '../../../lib/rley/syntax/grammar_builder'
require_relative '../../../lib/rley/parser/token'
# Load the class under test
require_relative '../../../lib/rley/parser/earley_parser'
module Rley # Open this namespace to avoid module qualifier prefixes
@@ -341,9 +342,39 @@
{ origin: 0, production: prod_S1, dot: -1 },
{ origin: 2, production: prod_M1, dot: 1 },
{ origin: 0, production: prod_P, dot: -1 }
]
compare_state_set(parse_result.chart[5], expectations)
+ end
+
+
+ it 'should parse an ambiguous grammar' do
+ # Grammar 3: A ambiguous arithmetic expression language
+ # (based on example in article on Earley's algorithm in Wikipedia)
+ # P ::= S.
+ # S ::= S "+" S.
+ # S ::= S "*" S.
+ # S ::= T.
+ # T ::= an integer number token.
+ t_int = Syntax::Literal.new('integer', /[-+]?\d+/)
+ t_plus = Syntax::VerbatimSymbol.new('+')
+ t_star = Syntax::VerbatimSymbol.new('*')
+
+ builder = Syntax::GrammarBuilder.new
+ builder.add_terminals(t_int, t_plus, t_star)
+ builder.add_production('P' => 'S')
+ builder.add_production('S' => %w(S + S))
+ builder.add_production('S' => %w(S * S))
+ builder.add_production('S' => 'L')
+ builder.add_production('L' => 'integer')
+ tokens = [
+ Token.new('2', t_int),
+ Token.new('+', t_plus),
+ Token.new('3', t_int),
+ Token.new('*', t_star),
+ Token.new('4', t_int)
+ ]
+ parse_result = subject.parse(tokens)
end
it 'should parse an invalid simple input' do
# Parse an erroneous input (b is missing)