mod ast;
mod carrier;
mod diagnostic;
mod lex;
mod lower;
mod parse;
mod subset;
pub const GRAMMAR_VERSION: &str = "v0.9.0";
pub use ast::{
D2Document, EdgeDeclaration, EdgeLink, EdgeOperator, Field, FieldAssignment, KeyPath,
KeySegment, Scalar, ShapeDeclaration, Span, Statement, StyleProperty, SvugyProperty,
SvugyValue,
};
pub use diagnostic::{Construct, D2Language, SyntaxError, UnsupportedConstruct};
use crate::diagnostic::{Import, ImportParts};
use diagnostic::Diagnostics;
use lex::Token;
use parse::SyntaxStatement;
use subset::SubsetFilter;
pub type D2Import = Import<D2Language>;
pub type D2ImportParts = ImportParts<D2Language>;
#[derive(Debug, Clone, PartialEq)]
pub struct D2Parse {
pub document: D2Document,
pub errors: Vec<SyntaxError>,
pub warnings: Vec<UnsupportedConstruct>,
}
impl D2Parse {
pub fn parse(source: &str) -> Self {
let mut diagnostics = Diagnostics::default();
let tokens = Token::lex_all(source, &mut diagnostics);
let syntax_statements = SyntaxStatement::parse_all(&tokens, source, &mut diagnostics);
let document = SubsetFilter::filter_document(syntax_statements, &mut diagnostics);
let (errors, warnings) = diagnostics.into_sorted_parts();
Self {
document,
errors,
warnings,
}
}
}