Skip to content

Commit 99e3b4b

Browse files
committed
refactor
1 parent 6b040c8 commit 99e3b4b

File tree

3 files changed

+113
-88
lines changed

3 files changed

+113
-88
lines changed

examples/main.cyr

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,3 @@
1-
import std::io;
1+
for #i = sample(); i < sample(); {
22

3-
pub fn main() {
4-
#a = 10;
5-
#b: i32 = 20;
6-
#result = a + b;
7-
std::io::printf("result: %d\n", result);
8-
}
3+
}

parser/src/expressions.rs

Lines changed: 38 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,11 @@ use utils::compile_time_errors::errors::CompileTimeError;
77
use utils::compile_time_errors::parser_errors::ParserErrorType;
88

99
impl<'a> Parser<'a> {
10-
pub fn parse_expression(&mut self, precedence: Precedence) -> Result<(Expression, Span), ParseError> {
10+
pub fn parse_expression(
11+
&mut self,
12+
precedence: Precedence,
13+
match_current: bool,
14+
) -> Result<(Expression, Span), ParseError> {
1115
let mut left_start = self.current_token.span.start;
1216
let mut left = self.parse_prefix_expression()?;
1317

@@ -16,9 +20,14 @@ impl<'a> Parser<'a> {
1620
}
1721

1822
while self.current_token.kind != TokenKind::EOF
19-
&& precedence < token_precedence_of(self.peek_token.kind.clone())
23+
&& precedence
24+
< token_precedence_of(if match_current {
25+
self.current_token.kind.clone()
26+
} else {
27+
self.peek_token.kind.clone()
28+
})
2029
{
21-
match self.parse_infix_expression(left.clone(), left_start) {
30+
match self.parse_infix_expression(left.clone(), left_start, match_current) {
2231
Some(infix) => {
2332
left = infix?;
2433

@@ -192,7 +201,7 @@ impl<'a> Parser<'a> {
192201

193202
self.next_token(); // consume the prefix operator
194203

195-
let (expr, span) = self.parse_expression(Precedence::Prefix)?;
204+
let (expr, span) = self.parse_expression(Precedence::Prefix, false)?;
196205

197206
Expression::Prefix(UnaryExpression {
198207
operator: prefix_operator,
@@ -203,7 +212,7 @@ impl<'a> Parser<'a> {
203212
}
204213
TokenKind::LeftParen => {
205214
self.next_token();
206-
let expr = self.parse_expression(Precedence::Lowest)?.0;
215+
let expr = self.parse_expression(Precedence::Lowest, false)?.0;
207216
self.expect_peek(TokenKind::RightParen)?;
208217
expr
209218
}
@@ -234,8 +243,17 @@ impl<'a> Parser<'a> {
234243
&mut self,
235244
left: Expression,
236245
left_start: usize,
246+
match_current: bool,
237247
) -> Option<Result<Expression, ParseError>> {
238-
match &self.peek_token.kind {
248+
let token_kind = {
249+
if match_current {
250+
self.current_token.kind.clone()
251+
} else {
252+
self.peek_token.kind.clone()
253+
}
254+
};
255+
256+
match token_kind {
239257
TokenKind::Plus
240258
| TokenKind::Minus
241259
| TokenKind::Asterisk
@@ -248,12 +266,15 @@ impl<'a> Parser<'a> {
248266
| TokenKind::GreaterEqual
249267
| TokenKind::GreaterThan
250268
| TokenKind::Identifier { .. } => {
251-
self.next_token(); // consume left expression
269+
if !match_current {
270+
self.next_token(); // consume left expression
271+
}
272+
252273
let operator = self.current_token.clone();
253274
let precedence = token_precedence_of(self.current_token.kind.clone());
254275
self.next_token(); // consume the operator
255276

256-
let (right, span) = self.parse_expression(precedence).unwrap();
277+
let (right, span) = self.parse_expression(precedence, false).unwrap();
257278

258279
Some(Ok(Expression::Infix(BinaryExpression {
259280
operator,
@@ -317,7 +338,7 @@ impl<'a> Parser<'a> {
317338
}
318339
self.next_token(); // consume the starting token
319340

320-
let first_argument = self.parse_expression(Precedence::Lowest)?.0;
341+
let first_argument = self.parse_expression(Precedence::Lowest, false)?.0;
321342
series.push(first_argument);
322343

323344
while self.peek_token_is(TokenKind::Comma) {
@@ -331,7 +352,7 @@ impl<'a> Parser<'a> {
331352
self.next_token(); // consume the comma
332353

333354
// dbg!(self.current_token.kind.clone());
334-
let argument = self.parse_expression(Precedence::Lowest)?.0;
355+
let argument = self.parse_expression(Precedence::Lowest, false)?.0;
335356
series.push(argument);
336357
}
337358

@@ -408,15 +429,17 @@ impl<'a> Parser<'a> {
408429
}
409430
}
410431

411-
if (self.current_token_is(TokenKind::RightParen) || self.current_token_is(TokenKind::RightBracket)) != true && !self.current_token_is(TokenKind::Semicolon) {
432+
if (self.current_token_is(TokenKind::RightParen) || self.current_token_is(TokenKind::RightBracket)) != true
433+
&& !self.current_token_is(TokenKind::Semicolon)
434+
{
412435
return Err(CompileTimeError {
413436
location: self.current_location(),
414437
etype: ParserErrorType::MissingSemicolon,
415438
file_name: Some(self.lexer.file_name.clone()),
416439
code_raw: Some(self.lexer.select(left_start..self.current_token.span.end)),
417440
verbose: None,
418441
caret: true,
419-
});
442+
});
420443
}
421444

422445
Ok(Expression::FieldAccessOrMethodCall(chains))
@@ -639,7 +662,7 @@ impl<'a> Parser<'a> {
639662
};
640663
self.expect_current(TokenKind::Colon)?;
641664

642-
let value = self.parse_expression(Precedence::Lowest)?.0;
665+
let value = self.parse_expression(Precedence::Lowest, false)?.0;
643666
self.next_token(); // consume expr
644667

645668
field_inits.push(FieldInit {
@@ -695,7 +718,7 @@ impl<'a> Parser<'a> {
695718
self.next_token(); // consume identifier
696719
self.next_token(); // consume assign
697720

698-
let expr = self.parse_expression(Precedence::Lowest)?.0;
721+
let expr = self.parse_expression(Precedence::Lowest, false)?.0;
699722

700723
let end = self.current_token.span.end;
701724

@@ -712,7 +735,7 @@ impl<'a> Parser<'a> {
712735

713736
self.expect_current(TokenKind::Assign)?;
714737

715-
let expr = self.parse_expression(Precedence::Lowest)?.0;
738+
let expr = self.parse_expression(Precedence::Lowest, false)?.0;
716739

717740
Ok(Expression::ArrayIndexAssign(Box::new(ArrayIndexAssign {
718741
from_package: array_index.from_package,

0 commit comments

Comments
 (0)