use crate::ast::{ListType, SymbolType, Type};
use crate::error::RelixError;
use crate::lexer::TokenKind;
use crate::lookups::{BindingPower, Lookups};
use crate::parser::Parser;
pub fn parse_type(p: &mut Parser, lu: &Lookups, bp: BindingPower) -> Result<Type, RelixError> {
let token_kind = p.current_token_kind();
let nud_fn = lu.type_nud.get(&token_kind).ok_or_else(|| {
RelixError::new(format!("type: NUD Handler expected for token {}\n", token_kind))
})?;
let mut left = nud_fn(p, lu)?;
while lu
.type_bp
.get(&p.current_token_kind())
.copied()
.unwrap_or(BindingPower::Default)
> bp
{
let token_kind = p.current_token_kind();
let led_fn = lu.type_led.get(&token_kind).ok_or_else(|| {
RelixError::new(format!("type: LED Handler expected for token {}\n", token_kind))
})?;
left = led_fn(p, lu, left, bp)?;
}
Ok(left)
}
pub fn parse_symbol_type(p: &mut Parser, _lu: &Lookups) -> Result<Type, RelixError> {
Ok(Type::Symbol(SymbolType {
value: p.advance().value,
}))
}
pub fn parse_list_type(p: &mut Parser, lu: &Lookups) -> Result<Type, RelixError> {
p.advance();
p.expect(TokenKind::CloseBracket)?;
let inner = parse_type(p, lu, BindingPower::Default)?;
Ok(Type::List(ListType {
underlying: Box::new(inner),
}))
}