#![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(Clone, Copy, Debug, PartialEq, PartialOrd, Eq, Ord)]
pub enum ErrPriority {
Normal,
Critical,
}
#[derive(Debug, Clone)]
pub struct Error {
pub pos: Possition,
pub descr: String,
pub line: String,
pub errors: Vec<Error>,
pub parsing_rules: Vec<String>,
pub priority: ErrPriority,
}
#[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) rules: &'a expression::SetOfRules,
pub(crate) potential_error: Option<Error>,
pub(crate) trace_rules: bool,
pub(crate) walking_rules: Vec<String>,
}
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(),
trace_rules: false,
walking_rules: vec![],
rules,
potential_error: None,
}
}
pub(crate) fn init_debug(
t2p: &'a str,
rules: &'a expression::SetOfRules,
trace_rules: bool,
) -> Self {
Status {
text2parse: t2p,
it_parsing: t2p.chars(),
pos: Possition::init(),
trace_rules,
walking_rules: vec![],
rules,
potential_error: None,
}
}
pub(crate) fn push_rule(mut self, on_node: &str) -> Self {
self.walking_rules.push(on_node.to_string());
self
}
pub(crate) fn set_potential_error(mut self, err: Error) -> Self {
self.potential_error = Some(err);
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, prior: ErrPriority) -> 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(),
priority: prior,
}
}
pub(crate) fn from_status_normal(status: &Status, descr: &str) -> Self {
Self::from_status(status, descr, ErrPriority::Normal)
}
pub(crate) fn from_st_errs(status: &Status, descr: &str, errors: Vec<Error>) -> Self {
let max_pr = |verrors: &Vec<Error>| {
use std::cmp::max;
verrors
.iter()
.fold(ErrPriority::Normal, |acc, err| max(acc, err.priority))
};
let mp = max_pr(&errors);
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(),
priority: mp,
}
}
}