use super::design_unit::parse_design_file;
use super::tokens::{Symbols, TokenStream, Tokenizer};
use crate::ast::DesignFile;
use crate::data::*;
use std::io;
use std::sync::Arc;
#[derive(Default)]
pub struct VHDLParser {
pub symbols: Arc<Symbols>,
}
pub type ParserResult = Result<(Source, DesignFile), io::Error>;
impl VHDLParser {
pub fn symbol(&self, name: &Latin1String) -> Symbol {
self.symbols.symtab().insert(name)
}
pub fn parse_design_source(
&self,
source: &Source,
diagnostics: &mut dyn DiagnosticHandler,
) -> DesignFile {
let contents = source.contents();
let tokenizer = Tokenizer::new(&self.symbols, source, ContentReader::new(&contents));
let mut stream = TokenStream::new(tokenizer);
match parse_design_file(&mut stream, diagnostics) {
Ok(design_file) => design_file,
Err(diagnostic) => {
diagnostics.push(diagnostic);
DesignFile::default()
}
}
}
pub fn parse_design_file(
&self,
file_name: &Path,
diagnostics: &mut dyn DiagnosticHandler,
) -> ParserResult {
let source = Source::from_latin1_file(file_name)?;
let design_file = self.parse_design_source(&source, diagnostics);
Ok((source, design_file))
}
}