rl_lang/parser/expressions/
logical.rs1use 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}