#![warn(missing_docs)]
use ast;
use std::result;
pub mod atom;
pub mod expression;
use std::str::Chars;
#[derive(PartialEq, Clone, Debug)]
pub struct Possition {
pub n: usize,
pub row: usize,
pub col: usize,
pub start_line: usize,
}
impl Possition {
fn init() -> Self {
Self {
n: 0,
row: 0,
col: 0,
start_line: 0,
}
}
}
#[derive(Debug)]
pub struct Error {
pub pos: Possition,
pub descr: String,
pub line: String,
pub errors: Vec<Error>,
pub parsing_rules: Vec<String>,
}
#[derive(Debug, Clone)]
pub(crate) struct Status<'a> {
pub(crate) text2parse: &'a str,
pub(crate) it_parsing: Chars<'a>,
pub(crate) pos: Possition,
pub(crate) walking_rules: Vec<String>,
pub(crate) rules: &'a expression::SetOfRules,
}
impl<'a> Status<'a> {
pub(crate) fn init(t2p: &'a str, rules: &'a expression::SetOfRules) -> Self {
Status {
text2parse: t2p,
it_parsing: t2p.chars(),
pos: Possition::init(),
walking_rules: vec![],
rules: rules,
}
}
pub(crate) fn push_rule(mut self, on_node: &str) -> Self {
self.walking_rules.push(on_node.to_string());
self
}
}
pub(crate) type Result<'a> = result::Result<(Status<'a>, ast::Node), Error>;
#[cfg(test)]
mod test;
impl Error {
pub(crate) fn from_status(status: &Status, descr: &str) -> Self {
Error {
pos: status.pos.clone(),
descr: descr.to_owned(),
line: status.text2parse[status.pos.start_line..status.pos.n].to_string(),
errors: vec![],
parsing_rules: status.walking_rules.clone(),
}
}
pub(crate) fn from_st_errs(status: &Status, descr: &str, errors: Vec<Error>) -> Self {
Error {
pos: status.pos.clone(),
descr: descr.to_owned(),
line: status.text2parse[status.pos.start_line..status.pos.n].to_string(),
errors,
parsing_rules: status.walking_rules.clone(),
}
}
}