jetcrab\parser\expressions/
arithmetic.rs

1use crate::ast::{BinaryExpression, Node};
2use crate::parser::error::ParseResult;
3use crate::parser::Parser;
4
5impl Parser {
6    pub fn parse_additive_expression(&mut self) -> ParseResult<Node> {
7        let mut left = self.parse_multiplicative_expression()?;
8
9        while self.is_additive_operator() {
10            let operator = self.current_token_string();
11            self.advance();
12            let right = Box::new(self.parse_multiplicative_expression()?);
13
14            let span = self.create_span_from_tokens();
15            left = Node::BinaryExpression(BinaryExpression {
16                left: Box::new(left),
17                operator,
18                right,
19                span: Some(span),
20            });
21        }
22
23        Ok(left)
24    }
25
26    pub fn parse_multiplicative_expression(&mut self) -> ParseResult<Node> {
27        let mut left = self.parse_exponentiation_expression()?;
28
29        while self.is_multiplicative_operator() {
30            let operator = self.current_token_string();
31            self.advance();
32            let right = Box::new(self.parse_exponentiation_expression()?);
33
34            let span = self.create_span_from_tokens();
35            left = Node::BinaryExpression(BinaryExpression {
36                left: Box::new(left),
37                operator,
38                right,
39                span: Some(span),
40            });
41        }
42
43        Ok(left)
44    }
45
46    pub fn parse_exponentiation_expression(&mut self) -> ParseResult<Node> {
47        let mut left = self.parse_unary_expression()?;
48
49        while self.is_exponentiation_operator() {
50            let operator = self.current_token_string();
51            self.advance();
52            let right = Box::new(self.parse_exponentiation_expression()?);
53
54            let span = self.create_span_from_tokens();
55            left = Node::BinaryExpression(BinaryExpression {
56                left: Box::new(left),
57                operator,
58                right,
59                span: Some(span),
60            });
61        }
62
63        Ok(left)
64    }
65}