Refactor parser module
This commit is contained in:
parent
73845224d5
commit
035afbf22f
33
src/parser/boxed_parser.rs
Normal file
33
src/parser/boxed_parser.rs
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
use crate::bnf::Bnf;
|
||||||
|
use crate::parser::{ParseResult, Parser, ParserInput};
|
||||||
|
|
||||||
|
pub struct BoxedParser<'a, I, O, E>
|
||||||
|
where
|
||||||
|
I: ParserInput,
|
||||||
|
{
|
||||||
|
inner: Box<dyn Parser<I, O, E> + 'a>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a, I, O, E> BoxedParser<'a, I, O, E>
|
||||||
|
where
|
||||||
|
I: ParserInput,
|
||||||
|
{
|
||||||
|
pub(crate) fn new<P>(inner: P) -> Self
|
||||||
|
where
|
||||||
|
P: Parser<I, O, E> + 'a,
|
||||||
|
{
|
||||||
|
BoxedParser {
|
||||||
|
inner: Box::new(inner),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a, I: ParserInput, O, E> Parser<I, O, E> for BoxedParser<'a, I, O, E> {
|
||||||
|
fn parse(&self, input: I) -> ParseResult<I, O, E> {
|
||||||
|
self.inner.parse(input)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn bnf(&self) -> Option<Bnf> {
|
||||||
|
self.inner.bnf()
|
||||||
|
}
|
||||||
|
}
|
@ -1,6 +1,10 @@
|
|||||||
|
mod boxed_parser;
|
||||||
|
|
||||||
use crate::bnf::Bnf;
|
use crate::bnf::Bnf;
|
||||||
use std::rc::Rc;
|
use std::rc::Rc;
|
||||||
|
|
||||||
|
pub use boxed_parser::BoxedParser;
|
||||||
|
|
||||||
pub type ParseResult<I, O, E> = Result<(O, I), E>;
|
pub type ParseResult<I, O, E> = Result<(O, I), E>;
|
||||||
|
|
||||||
pub trait ParserInput: std::fmt::Debug {}
|
pub trait ParserInput: std::fmt::Debug {}
|
||||||
@ -122,37 +126,6 @@ where
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct BoxedParser<'a, I, O, E>
|
|
||||||
where
|
|
||||||
I: ParserInput,
|
|
||||||
{
|
|
||||||
inner: Box<dyn Parser<I, O, E> + 'a>,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<'a, I, O, E> BoxedParser<'a, I, O, E>
|
|
||||||
where
|
|
||||||
I: ParserInput,
|
|
||||||
{
|
|
||||||
pub(crate) fn new<P>(inner: P) -> Self
|
|
||||||
where
|
|
||||||
P: Parser<I, O, E> + 'a,
|
|
||||||
{
|
|
||||||
BoxedParser {
|
|
||||||
inner: Box::new(inner),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<'a, I: ParserInput, O, E> Parser<I, O, E> for BoxedParser<'a, I, O, E> {
|
|
||||||
fn parse(&self, input: I) -> ParseResult<I, O, E> {
|
|
||||||
self.inner.parse(input)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn bnf(&self) -> Option<Bnf> {
|
|
||||||
self.inner.bnf()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<I: ParserInput, O, E, F> Parser<I, O, E> for F
|
impl<I: ParserInput, O, E, F> Parser<I, O, E> for F
|
||||||
where
|
where
|
||||||
F: Fn(I) -> ParseResult<I, O, E>,
|
F: Fn(I) -> ParseResult<I, O, E>,
|
Loading…
Reference in New Issue
Block a user