pub struct FnParser<I: View<V = Seq<u8>>, O: DeepView, Spec: SpecParser<PVal = O::V>, Exec: Fn(&I) -> PResult<O>> {
pub exec_fn: Exec,
pub spec_fn: Ghost<Spec>,
pub _marker: PhantomData<(I, O)>,
}Expand description
Pairs an executable parser closure with a ghost specification parser.
Fields§
§exec_fn: Exec§spec_fn: Ghost<Spec>§_marker: PhantomData<(I, O)>Implementations§
Source§impl<I, O, Spec, Exec> FnParser<I, O, Spec, Exec>
impl<I, O, Spec, Exec> FnParser<I, O, Spec, Exec>
Sourcepub exec fn new(exec_fn: Exec, Ghost(spec_fn): Ghost<Spec>) -> parser : Self
pub exec fn new(exec_fn: Exec, Ghost(spec_fn): Ghost<Spec>) -> parser : Self
requires
spec_fn.safe_inv(),spec_fn.productive_inv(),forall |i: &I| #[trigger] call_requires(exec_fn, (i,)),forall |i: &I, r: PResult<O>| {
#[trigger] call_ensures(exec_fn, (i,), r)
==> parse_matches_spec(r, spec_fn.spec_parse(i@))
},ensuresparser.exec_inv(),parser.safe_inv(),parser.productive_inv(),parser.spec_fn == spec_fn,Constructs a safe, productive parser callback with a ghost specification.
Trait Implementations§
Source§impl<I, O, Spec, Exec> Parser<I> for FnParser<I, O, Spec, Exec>
impl<I, O, Spec, Exec> Parser<I> for FnParser<I, O, Spec, Exec>
Source§impl<I, O, Spec, Exec> Productive for FnParser<I, O, Spec, Exec>
impl<I, O, Spec, Exec> Productive for FnParser<I, O, Spec, Exec>
Source§open spec fn productive_inv(&self) -> bool
open spec fn productive_inv(&self) -> bool
{
let Ghost(spec_fn) = self.spec_fn;
spec_fn.productive_inv()
}Source§proof fn lemma_productive(&self, input: Seq<u8>)
proof fn lemma_productive(&self, input: Seq<u8>)
Source§impl<I, O, Spec, Exec> SafeParser for FnParser<I, O, Spec, Exec>
impl<I, O, Spec, Exec> SafeParser for FnParser<I, O, Spec, Exec>
Source§impl<I, O, Spec, Exec> SpecParser for FnParser<I, O, Spec, Exec>
impl<I, O, Spec, Exec> SpecParser for FnParser<I, O, Spec, Exec>
Auto Trait Implementations§
impl<I, O, Spec, Exec> Freeze for FnParser<I, O, Spec, Exec>where
Exec: Freeze,
impl<I, O, Spec, Exec> RefUnwindSafe for FnParser<I, O, Spec, Exec>
impl<I, O, Spec, Exec> Send for FnParser<I, O, Spec, Exec>
impl<I, O, Spec, Exec> Sync for FnParser<I, O, Spec, Exec>
impl<I, O, Spec, Exec> Unpin for FnParser<I, O, Spec, Exec>
impl<I, O, Spec, Exec> UnsafeUnpin for FnParser<I, O, Spec, Exec>where
Exec: UnsafeUnpin,
impl<I, O, Spec, Exec> UnwindSafe for FnParser<I, O, Spec, Exec>
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more