Skip to main content

rl_lang/parser/expressions/
logical.rs

1use crate::{
2    ast::{ExprId, nodes::ExpressionKind},
3    lexer::tokentypes::TokenType,
4    parser::parser_logic::Parser,
5    utils::errors::Error,
6};
7
8impl Parser {
9    pub fn parse_logical(&mut self) -> Result<ExprId, Error> {
10        let mut left = self.parse_equality()?;
11        while self.match_type(&[TokenType::And, TokenType::Or]) {
12            while self.match_type(&[TokenType::Newline]) {}
13            let operator = self.previous();
14            while self.match_type(&[TokenType::Newline]) {}
15            let right = self.parse_equality()?;
16            let left_id = self.ast_arena.exprs.get(left);
17            let right_id = self.ast_arena.exprs.get(right);
18
19            let span = left_id.span.join(right_id.span);
20            left = self.ast_arena.alloc_expr(
21                ExpressionKind::Binary {
22                    left,
23                    operator,
24                    right,
25                },
26                span,
27            );
28        }
29
30        Ok(left)
31    }
32}