ableos_userland/programs/aidl/src/parser/expr.rs

52 lines
2.0 KiB
Rust

use crate::{
ast::{Expr, Literal, NumberLiteral},
lexer::{NumberSuffix, Spanned, Token},
unwrap_match,
};
use super::{Parser, ParserError};
impl<'a> Parser<'a> {
pub fn ask_expr(&mut self) -> Result<Spanned<Expr>, ParserError> {
let Spanned(token, _) = self.tokens.peek()?;
Ok(match token {
Token::StringLiteral(_) | Token::NumberLiteral(_) | Token::CharLiteral(_) => {
self._ask_literal()?.map(Expr::Literal)
}
_ => return Err(self.expected("an expression")),
})
}
fn _ask_literal(&mut self) -> Result<Spanned<Literal>, ParserError> {
let Spanned(token, mut span) = self.tokens.next()?;
Ok(match token {
Token::StringLiteral(string) => Spanned(Literal::String(string), span),
Token::CharLiteral(chr) => Spanned(Literal::Char(chr), span),
Token::NumberLiteral(number) => {
let lit = if let Spanned(Token::NumberSuffix(_), sp) = self.tokens.peek()? {
span = span + sp;
use NumberLiteral::*;
Literal::Number(
match unwrap_match!(
self.tokens.next()?, Spanned(Token::NumberSuffix(suffering), _) => suffering) // eat suffix
{
NumberSuffix::Ptr => Ptr(number as usize),
NumberSuffix::U8 => U8(number as u8),
NumberSuffix::I8 => I8(number as i8),
NumberSuffix::U16 => U16(number as u16),
NumberSuffix::I16 => I16(number as i16),
_ => todo!(),
},
)
} else {
Literal::Number(NumberLiteral::Infer(number))
};
Spanned(lit, span)
}
_ => return Err(self.expected("a literal")),
})
}
}