custom integer with falliblity
This commit is contained in:
parent
882f30371e
commit
5aba59b291
|
|
@ -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>
|
fn type_parser<'a, E>() -> impl Parser<'a, TokenInput<'a>, Type, E>
|
||||||
where
|
where
|
||||||
E: chumsky::extra::ParserExtra<'a, TokenInput<'a>> + 'a,
|
E: chumsky::extra::ParserExtra<'a, TokenInput<'a>, Error = EmptyErr> + 'a,
|
||||||
{
|
{
|
||||||
let primitives = select! {
|
let primitives = select! {
|
||||||
Token::Void => InnerType::Unit,
|
Token::Void => InnerType::Unit,
|
||||||
|
|
@ -408,16 +408,24 @@ where
|
||||||
Token::I64 => InnerType::Int { signed: true, size: IntSize::Bits(64) },
|
Token::I64 => InnerType::Int { signed: true, size: IntSize::Bits(64) },
|
||||||
Token::ISize => InnerType::Int { signed: true, size: IntSize::Pointer },
|
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')))
|
let integral_type = choice((just::<_, _, extra::Default>('u'), just('i')))
|
||||||
.then(text::int(10).to_slice().from_str::<u16>().unwrapped())
|
.then(u16)
|
||||||
.map(|(sign, size)| InnerType::Int {
|
.map(|(sign, size)| InnerType::Int {
|
||||||
signed: sign == 'i',
|
signed: sign == 'i',
|
||||||
size: IntSize::Bits(size),
|
size: IntSize::Bits(size),
|
||||||
});
|
});
|
||||||
|
|
||||||
let custom_int =
|
let custom_int = select! {Token::Ident(ident) => ident}.try_map(move |s, _span| {
|
||||||
select! {Token::Ident(ident) => ident}.map(move |s| custom_int_inner.parse(s).unwrap());
|
integral_type
|
||||||
|
.parse(s)
|
||||||
|
.into_result()
|
||||||
|
.map_err(|_| EmptyErr::default())
|
||||||
|
});
|
||||||
|
|
||||||
recursive(|ty| {
|
recursive(|ty| {
|
||||||
let pointer = just(Token::Star)
|
let pointer = just(Token::Star)
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue