75 lines
1.4 KiB
Rust
75 lines
1.4 KiB
Rust
#![feature(
|
|
iter_advance_by,
|
|
box_into_inner,
|
|
bigint_helper_methods,
|
|
map_try_insert,
|
|
iter_intersperse,
|
|
iter_array_chunks,
|
|
int_roundings,
|
|
if_let_guard,
|
|
debug_closure_helpers,
|
|
box_vec_non_null,
|
|
macro_metavar_expr
|
|
)]
|
|
#![allow(unused_macros, unsafe_op_in_unsafe_fn)]
|
|
|
|
pub mod asm;
|
|
pub mod ast;
|
|
pub mod common;
|
|
pub mod comptime;
|
|
pub mod error;
|
|
//pub mod intern_pool;
|
|
pub mod ast2;
|
|
pub mod lexer;
|
|
pub mod mir;
|
|
pub mod parser;
|
|
pub mod string_table;
|
|
pub mod symbol_table;
|
|
pub mod tokens;
|
|
pub mod triples;
|
|
|
|
pub mod utils;
|
|
use utils::unit;
|
|
|
|
pub fn tokenize<'a>(
|
|
bytes: &'a [u8],
|
|
) -> Result<lexer::Tokenizer<'a>, (lexer::Tokenizer<'a>, Vec<lexer::TokenizeError>)> {
|
|
lexer::Tokenizer::new_with_errors(bytes)
|
|
}
|
|
|
|
trait BitSize {
|
|
fn bits(&self) -> u32;
|
|
}
|
|
|
|
macro_rules! impl_bitsize_int {
|
|
($($ty:ty)*) => {
|
|
|
|
$(
|
|
impl BitSize for $ty {
|
|
fn bits(&self) -> u32 {
|
|
Self::BITS as u32 - self.trailing_zeros() as u32
|
|
}
|
|
})*
|
|
};
|
|
}
|
|
|
|
impl_bitsize_int!(u8 u16 u32 u64 u128);
|
|
|
|
impl BitSize for &[u8] {
|
|
fn bits(&self) -> u32 {
|
|
let bytes = self.as_ref();
|
|
let mut bits = bytes.len() * u8::BITS as usize;
|
|
|
|
for &d in bytes.iter().rev() {
|
|
if d == 0 {
|
|
bits -= u8::BITS as usize;
|
|
} else {
|
|
bits -= d.leading_zeros() as usize;
|
|
break;
|
|
}
|
|
}
|
|
|
|
bits as u32
|
|
}
|
|
}
|