mod comment;
mod common;
mod decl;
mod e2e;
mod error_recovery;
mod expr;
mod lexer;
mod scopes;
mod stmt;
mod traversal;
mod utils;
#[cfg(feature = "preprocessing")]
mod preprocessing;
use similar::{ChangeTag, TextDiff};
use std::fmt::Write;
fn diff(a: &str, b: &str) -> String {
let diff = TextDiff::from_lines(a, b);
diff.iter_all_changes()
.fold(String::new(), |mut accum, change| {
let sign = match change.tag() {
ChangeTag::Insert => "+",
ChangeTag::Delete => "-",
ChangeTag::Equal => " ",
};
let _ = write!(accum, "{}{}", sign, change);
accum
})
}
macro_rules! token {
($Variant:ident $lexeme:literal $($span:tt)+) => {
$crate::token::Token::$Variant(
::gramatika::arcstr::literal_substr!($lexeme),
token!($($span)+),
)
};
(($start_line:literal : $start_char:literal .. $end_line:literal : $end_char:literal)) => {
::gramatika::Span::new(($start_line-1, $start_char-1), ($end_line-1, $end_char-1))
};
}
use token;