mod source;
pub use source::token;
pub mod ast;
pub mod index;
mod lexer;
pub mod parser;
pub mod resolve;
pub mod words;
use std::path::Path;
use yog_data::Diagnostic;
use yog_ids::Format;
#[derive(Debug)]
pub struct Parsed {
pub file: ast::File,
pub problems: Vec<Diagnostic>,
}
#[derive(Debug)]
pub struct Checked {
pub file: ast::File,
pub symbols: resolve::Symbols,
pub problems: Vec<Diagnostic>,
}
#[must_use]
pub fn parse(name: &str, src: &str) -> Parsed {
let mut report = yog_analysis::Report::new(name, src);
let file = read(name, src, &mut report);
Parsed {
file,
problems: report.out,
}
}
#[must_use]
pub fn check(name: &str, src: &str) -> Checked {
let mut report = yog_analysis::Report::new(name, src);
let file = read(name, src, &mut report);
let symbols = resolve::resolve(&file, &mut report);
Checked {
file,
symbols,
problems: report.out,
}
}
fn read(name: &str, src: &str, report: &mut yog_analysis::Report<'_>) -> ast::File {
let nanites = Format::Nanites.is(Path::new(name));
let tokens = lexer::lex(src, report);
parser::Parser::new(&tokens, report, nanites).file()
}