Add middleware PrimaryExpression-struct to make TokenRanges correct

This commit is contained in:
Sofia 2025-07-05 18:02:06 +03:00
parent 20dfdfec9f
commit 454cefafc9

View File

@ -28,31 +28,32 @@ impl Parse for Type {
impl Parse for Expression { impl Parse for Expression {
fn parse(mut stream: TokenStream) -> Result<Expression, Error> { fn parse(mut stream: TokenStream) -> Result<Expression, Error> {
let lhs = parse_primary_expression(&mut stream)?; let lhs = stream.parse::<PrimaryExpression>()?.0;
parse_binop_rhs(&mut stream, lhs, None) parse_binop_rhs(&mut stream, lhs, None)
} }
} }
fn parse_primary_expression(stream: &mut TokenStream) -> Result<Expression, Error> { #[derive(Debug)]
pub struct PrimaryExpression(Expression);
impl Parse for PrimaryExpression {
fn parse(mut stream: TokenStream) -> Result<Self, Error> {
use ExpressionKind as Kind; use ExpressionKind as Kind;
if let Ok(exp) = stream.parse() { let expr = if let Ok(exp) = stream.parse() {
Ok(Expression( Expression(
Kind::FunctionCall(Box::new(exp)), Kind::FunctionCall(Box::new(exp)),
stream.get_range().unwrap(), stream.get_range().unwrap(),
)) )
} else if let Ok(block) = stream.parse() { } else if let Ok(block) = stream.parse() {
Ok(Expression( Expression(
Kind::BlockExpr(Box::new(block)), Kind::BlockExpr(Box::new(block)),
stream.get_range().unwrap(), stream.get_range().unwrap(),
)) )
} else if let Ok(ifexpr) = stream.parse() { } else if let Ok(ifexpr) = stream.parse() {
Ok(Expression( Expression(Kind::IfExpr(Box::new(ifexpr)), stream.get_range().unwrap())
Kind::IfExpr(Box::new(ifexpr)),
stream.get_range().unwrap(),
))
} else if let Some(token) = stream.next() { } else if let Some(token) = stream.next() {
Ok(match &token { match &token {
Token::Identifier(v) => { Token::Identifier(v) => {
Expression(Kind::VariableName(v.clone()), stream.get_range().unwrap()) Expression(Kind::VariableName(v.clone()), stream.get_range().unwrap())
} }
@ -66,9 +67,11 @@ fn parse_primary_expression(stream: &mut TokenStream) -> Result<Expression, Erro
exp exp
} }
_ => Err(stream.expected_err("identifier, constant or parentheses")?)?, _ => Err(stream.expected_err("identifier, constant or parentheses")?)?,
}) }
} else { } else {
Err(stream.expected_err("expression")?)? Err(stream.expected_err("expression")?)?
};
Ok(PrimaryExpression(expr))
} }
} }
@ -95,7 +98,7 @@ fn parse_binop_rhs(
stream.parse_if::<BinaryOperator, _>(|b| b.get_precedence() >= expr_precedence) stream.parse_if::<BinaryOperator, _>(|b| b.get_precedence() >= expr_precedence)
{ {
let curr_token_prec = op.get_precedence(); let curr_token_prec = op.get_precedence();
let mut rhs = parse_primary_expression(stream)?; let mut rhs = stream.parse::<PrimaryExpression>()?.0;
if let Ok(next_op) = stream.parse_peek::<BinaryOperator>() { if let Ok(next_op) = stream.parse_peek::<BinaryOperator>() {
let next_prec = next_op.get_precedence(); let next_prec = next_op.get_precedence();