custom integer with falliblity

This commit is contained in:
janis 2025-10-03 19:37:42 +02:00
parent 882f30371e
commit 5aba59b291
Signed by: janis
SSH key fingerprint: SHA256:bB1qbbqmDXZNT0KKD5c2Dfjg53JGhj7B3CFcLIzSqq8

View file

@ -389,7 +389,7 @@ fn new_token_input<'a>(input: &'a str) -> TokenInput<'a> {
fn type_parser<'a, E>() -> impl Parser<'a, TokenInput<'a>, Type, E>
where
E: chumsky::extra::ParserExtra<'a, TokenInput<'a>> + 'a,
E: chumsky::extra::ParserExtra<'a, TokenInput<'a>, Error = EmptyErr> + 'a,
{
let primitives = select! {
Token::Void => InnerType::Unit,
@ -408,16 +408,24 @@ where
Token::I64 => InnerType::Int { signed: true, size: IntSize::Bits(64) },
Token::ISize => InnerType::Int { signed: true, size: IntSize::Pointer },
};
let u16 = text::int(10)
.to_slice()
.from_str::<u16>()
.try_map(|u, _span| u.map_err(|_| EmptyErr::default()));
let custom_int_inner = choice((just::<_, _, extra::Default>('u'), just('i')))
.then(text::int(10).to_slice().from_str::<u16>().unwrapped())
let integral_type = choice((just::<_, _, extra::Default>('u'), just('i')))
.then(u16)
.map(|(sign, size)| InnerType::Int {
signed: sign == 'i',
size: IntSize::Bits(size),
});
let custom_int =
select! {Token::Ident(ident) => ident}.map(move |s| custom_int_inner.parse(s).unwrap());
let custom_int = select! {Token::Ident(ident) => ident}.try_map(move |s, _span| {
integral_type
.parse(s)
.into_result()
.map_err(|_| EmptyErr::default())
});
recursive(|ty| {
let pointer = just(Token::Star)