pub use self::not::NotEx;
pub use self::and::And;
pub use self::fuse::Fuse;
pub use self::char_class::CharClass;
pub use self::literal::Literal;
pub use self::dot::Dot;
pub use self::option::OptionEx;
pub use self::star::Star;
pub use self::plus::Plus;
pub use self::or::Or;
pub use self::sequence::Sequence;
pub use self::wrap::WrapEx;
pub use self::node::{Node, NodeContents, Data, Children, PreOrderNodes};
mod node;
#[cfg(test)]
#[macro_use]
pub mod test_utils;
#[macro_use]
mod literal;
#[macro_use]
mod char_class;
#[macro_use]
mod not;
#[macro_use]
mod and;
mod dot;
#[macro_use]
mod option;
#[macro_use]
mod star;
#[macro_use]
mod plus;
#[macro_use]
mod or;
#[macro_use]
mod fuse;
#[macro_use]
mod sequence;
#[macro_use]
mod wrap;
mod unicode;
#[doc(hidden)]
#[derive(Debug, Clone, PartialEq, Copy)]
pub struct ParseState<'a> {
pub input: &'a [u8], pub offset: usize }
impl<'a> ParseState<'a> {
fn advanceTo( &self, new_offset: usize ) -> ParseState<'a> {
let mut clone = self.clone();
clone.input = &clone.input[ new_offset - clone.offset .. ];
clone.offset = new_offset;
clone
}
fn sliceTo( &self, new_offset: usize ) -> &'a [u8] {
&self.input[ .. new_offset - self.offset ]
}
fn offsetToResult( &self, new_offset: usize )
-> Option< ParseResult<'a> > {
Some( ParseResult::oneNode(
Node::withoutName( self.offset,
new_offset,
Data( self.sliceTo( new_offset ) ) ),
self.advanceTo( new_offset ) ) )
}
}
#[doc(hidden)]
pub struct ParseResult<'a> {
pub nodes: Vec< Node<'a> >,
pub parse_state: ParseState<'a>
}
impl<'a> ParseResult<'a> {
pub fn oneNode( node: Node<'a>, parse_state: ParseState<'a> )
-> ParseResult<'a> {
ParseResult { nodes: vec!( node ), parse_state: parse_state }
}
pub fn fromParseState( parse_state: ParseState<'a> ) -> ParseResult<'a> {
ParseResult { nodes: vec!(), parse_state: parse_state }
}
}
pub trait Expression {
fn apply<'a>( &self, parse_state: &ParseState<'a> )
-> Option< ParseResult<'a> >;
}
pub type Rule = for<'a> fn( &ParseState<'a> ) -> Option< ParseResult<'a> >;