//! GLSL parsing. //! //! This module gives you several functions and types to deal with GLSL parsing, transforming an //! input source into an AST. The AST is defined in the [`syntax`] module. //! //! You want to use the [`Parse`]’s methods to get starting with parsing and pattern match on //! the resulting [`Result`]. In case of an error, you can inspect the content of the [`ParseError`] //! object in the `Err` variant. //! //! [`Parse`]: crate::parser::Parse //! [`ParseError`]: crate::parser::ParseError
use nom::error::convert_error; use nom::Err as NomErr; use std::fmt;
/// A parse error. It contains a [`String`] giving information on the reason why the parser failed. #[derive(Clone, Debug, Eq, PartialEq)] pubstruct ParseError { pub info: String,
}
/// Run a parser `P` on a given `[&str`] input. pub(crate) fn run_parser<P, T>(source: &str, parser: P) -> Result<T, ParseError> where
P: FnOnce(&str) -> ParserResult<T>,
{ match parser(source) {
Ok((_, x)) => Ok(x),
Err(e) => match e {
NomErr::Incomplete(_) => Err(ParseError {
info: "incomplete parser".to_owned(),
}),
NomErr::Error(err) | NomErr::Failure(err) => { let info = convert_error(source, err);
Err(ParseError { info })
}
},
}
}
/// Class of types that can be parsed. /// /// This trait exposes the [`Parse::parse`] function that can be used to parse GLSL types. /// /// The methods from this trait are the standard way to parse data into GLSL ASTs. pubtrait Parse: Sized { /// Parse from a string slice. fn parse<B>(source: B) -> Result<Self, ParseError> where
B: AsRef<str>;
}
/// Macro to implement Parse for a given type.
macro_rules! impl_parse {
($type_name:ty, $parser_name:ident) => { impl Parse for $type_name { fn parse<B>(source: B) -> Result<Self, ParseError> where
B: AsRef<str>,
{
run_parser(source.as_ref(), $crate::parsers::$parser_name)
}
}
};
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.