///|
fn main raise {
let grammar = @moonearley.parse_grammar("S -> 'let' 'name' '=' 'number' ';';").unwrap()
let session = @moonearley.Session::new(grammar).unwrap()
println("initial expected: \{session.report().expected().join(",")}")
let prefix = session
.push_all([
@moonearley.token("let", "let", 0, 3),
@moonearley.token("name", "answer", 4, 10),
])
.unwrap()
println("after declaration name: \{prefix.expected().join(",")}")
let branch = session.fork()
let bad = branch.push(@moonearley.token("number", "42", 11, 13)).unwrap()
let diagnostic = bad.diagnostic().unwrap()
assert_eq(diagnostic.token_index, 2)
assert_eq(diagnostic.char_start, 11)
assert_eq(diagnostic.expected_kinds, ["="])
println(
"rejected kind at offset \{diagnostic.char_start}; expected \{diagnostic.expected_kinds.join(",")}",
)
let complete = session
.push_all([
@moonearley.token("=", "=", 11, 12),
@moonearley.token("number", "42", 13, 15),
@moonearley.token(";", ";", 15, 16),
])
.unwrap()
assert_true(complete.accepted())
assert_true(!prefix.accepted())
println(
"original branch accepted: \{complete.accepted()}; old snapshot accepted: \{prefix.accepted()}",
)
}