use back::compiler::*;
type MatchPatternFn = for <'a> fn(&mut Context<'a>) -> syn::Pat;
fn ignore_value<'a>(_context: &mut Context<'a>) -> syn::Pat {
parse_quote!(_)
}
fn bind_value<'a>(context: &mut Context<'a>) -> syn::Pat {
let var = context.next_free_var();
parse_quote!(#var)
}
pub struct AnySingleCharCompiler
{
matched_pattern: MatchPatternFn
}
impl AnySingleCharCompiler
{
pub fn recognizer() -> AnySingleCharCompiler {
AnySingleCharCompiler {
matched_pattern: ignore_value
}
}
pub fn parser() -> AnySingleCharCompiler {
AnySingleCharCompiler {
matched_pattern: bind_value
}
}
}
impl CompileExpr for AnySingleCharCompiler
{
fn compile_expr<'a>(&self, context: &mut Context<'a>,
continuation: Continuation) -> syn::Expr
{
let pattern = (self.matched_pattern)(context);
continuation
.map_success(|success, failure| parse_quote!(
match state.next() {
Some(#pattern) => {
#success
}
None => {
state.error("<character>");
#failure
}
}
))
.unwrap_success()
}
}