mod addressing;
mod syntactic_token;
mod semantic_token;
mod tokenizer;
mod error;
mod assembler;

pub use addressing::{CharAddress, SourceLocation, BytecodeLocation};
pub use syntactic_token::{SyntacticToken, SyntacticTokenType};
pub use semantic_token::{SemanticToken, SemanticTokenType, LabelDefinition, MacroDefinition};
pub use error::Error;
pub use tokenizer::TokenIterator;
pub use assembler::Assembler;

pub fn assemble(source_code: &str) -> (Vec<u8>, Vec<SemanticToken>) {
    let mut assembler = Assembler::new();
    assembler.tokenise_source(source_code);
    assembler.resolve_references();
    assembler.generate_bytecode()
}