Skip to content

Commit 760bc40

Browse files
committed
feat: initial statements parse expressions
1 parent d1ff15e commit 760bc40

10 files changed

+104
-58
lines changed

Cargo.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "rust_monkey_interpreter"
3-
version = "0.7.0"
3+
version = "0.8.0"
44
authors = ["C <DeveloperC@protonmail.com>"]
55
edition = "2018"
66

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# Rust Monkey Interpreter
2-
[![pipeline status](https://img.shields.io/badge/Version-0.7.0-blue)](https://gitlab.com/DeveloperC/rust_monkey_interpreter/commits/master) [![pipeline status](https://gitlab.com/DeveloperC/rust_monkey_interpreter/badges/master/pipeline.svg)](https://gitlab.com/DeveloperC/rust_monkey_interpreter/commits/master) [![License: GPL v3](https://img.shields.io/badge/License-GPLv3-blue.svg)](https://www.gnu.org/licenses/gpl-3.0)
2+
[![pipeline status](https://img.shields.io/badge/Version-0.8.0-blue)](https://gitlab.com/DeveloperC/rust_monkey_interpreter/commits/master) [![pipeline status](https://gitlab.com/DeveloperC/rust_monkey_interpreter/badges/master/pipeline.svg)](https://gitlab.com/DeveloperC/rust_monkey_interpreter/commits/master) [![License: GPL v3](https://img.shields.io/badge/License-GPLv3-blue.svg)](https://www.gnu.org/licenses/gpl-3.0)
33

44
![The Monkey Programming Language Logo](https://cloud.githubusercontent.com/assets/1013641/22617482/9c60c27c-eb09-11e6-9dfa-b04c7fe498ea.png)
55

src/syntax_analysis/abstract_syntax_tree/syntax_tree_node/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,11 @@ pub enum SyntaxTreeNode {
1616
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
1717
pub enum Statement {
1818
LET {
19-
let_token: Token,
2019
identifier_token: Token,
20+
expression: Box<Expression>,
2121
},
2222
RETURN {
23-
return_token: Token,
23+
expression: Box<Expression>,
2424
},
2525
}
2626

src/syntax_analysis/mod.rs

Lines changed: 22 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -486,55 +486,53 @@ impl SyntaxAnalysis {
486486
fn parse_return_statement(&mut self) -> Option<SyntaxTreeNode> {
487487
debug!("Parsing a return statement.");
488488

489-
let return_token = self.current_token.clone();
490489
expect_token!(self, TokenType::RETURN, None);
491490

492-
//TODO handle expression.
493-
loop {
494-
match self.current_token.token_type {
495-
TokenType::SEMI_COLON => {
496-
self.increment_token_index();
497-
break;
498-
}
499-
_ => {
500-
self.increment_token_index();
501-
}
491+
let expression = match self.parse_expression(ExpressionPrecedence::LOWEST) {
492+
Some(expression) => expression,
493+
None => {
494+
syntax_error!(self, "".to_string());
495+
return None;
502496
}
497+
};
498+
499+
if self.current_token.token_type == TokenType::SEMI_COLON {
500+
self.increment_token_index();
503501
}
504502

505503
return Some(SyntaxTreeNode::STATEMENT {
506-
statement: Statement::RETURN { return_token },
504+
statement: Statement::RETURN {
505+
expression: Box::new(expression),
506+
},
507507
});
508508
}
509509

510510
fn parse_let_statement(&mut self) -> Option<SyntaxTreeNode> {
511511
debug!("Parsing a let statement.");
512512

513-
let let_token = self.current_token.clone();
514513
expect_token!(self, TokenType::LET, None);
515514

516515
let identifier_token = self.current_token.clone();
517516
expect_token!(self, TokenType::IDENTIFIER, None);
518517

519518
expect_token!(self, TokenType::ASSIGN, None);
520519

521-
//TODO handle expression.
522-
loop {
523-
match self.current_token.token_type {
524-
TokenType::SEMI_COLON => {
525-
self.increment_token_index();
526-
break;
527-
}
528-
_ => {
529-
self.increment_token_index();
530-
}
520+
let expression = match self.parse_expression(ExpressionPrecedence::LOWEST) {
521+
Some(expression) => expression,
522+
None => {
523+
syntax_error!(self, "".to_string());
524+
return None;
531525
}
526+
};
527+
528+
if self.current_token.token_type == TokenType::SEMI_COLON {
529+
self.increment_token_index();
532530
}
533531

534532
return Some(SyntaxTreeNode::STATEMENT {
535533
statement: Statement::LET {
536-
let_token,
537534
identifier_token,
535+
expression: Box::new(expression),
538536
},
539537
});
540538
}

src/syntax_analysis/snapshots/rust_monkey_interpreter__syntax_analysis__tests__test_syntax_analysis_for_combined_statements_case1.snap

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,17 @@ expression: returned_abstract_syntax_tree
88
"STATEMENT": {
99
"statement": {
1010
"LET": {
11-
"let_token": {
12-
"token_type": "LET",
13-
"literal": "let"
14-
},
1511
"identifier_token": {
1612
"token_type": "IDENTIFIER",
1713
"literal": "x"
14+
},
15+
"expression": {
16+
"INTEGER": {
17+
"integer_token": {
18+
"token_type": "INTEGER",
19+
"literal": "5"
20+
}
21+
}
1822
}
1923
}
2024
}
@@ -24,9 +28,13 @@ expression: returned_abstract_syntax_tree
2428
"STATEMENT": {
2529
"statement": {
2630
"RETURN": {
27-
"return_token": {
28-
"token_type": "RETURN",
29-
"literal": "RETURN"
31+
"expression": {
32+
"INTEGER": {
33+
"integer_token": {
34+
"token_type": "INTEGER",
35+
"literal": "5"
36+
}
37+
}
3038
}
3139
}
3240
}

src/syntax_analysis/snapshots/rust_monkey_interpreter__syntax_analysis__tests__test_syntax_analysis_for_let_statements_case1.snap

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,24 @@
11
---
22
source: src/syntax_analysis/tests.rs
3-
expression: returned_abstract_syntax_tree_1
3+
expression: returned_abstract_syntax_tree
44
---
55
{
66
"abstract_syntax_tree": [
77
{
88
"STATEMENT": {
99
"statement": {
1010
"LET": {
11-
"let_token": {
12-
"token_type": "LET",
13-
"literal": "let"
14-
},
1511
"identifier_token": {
1612
"token_type": "IDENTIFIER",
1713
"literal": "x"
14+
},
15+
"expression": {
16+
"INTEGER": {
17+
"integer_token": {
18+
"token_type": "INTEGER",
19+
"literal": "5"
20+
}
21+
}
1822
}
1923
}
2024
}

src/syntax_analysis/snapshots/rust_monkey_interpreter__syntax_analysis__tests__test_syntax_analysis_for_let_statements_case2.snap

Lines changed: 32 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,17 @@ expression: returned_abstract_syntax_tree
88
"STATEMENT": {
99
"statement": {
1010
"LET": {
11-
"let_token": {
12-
"token_type": "LET",
13-
"literal": "let"
14-
},
1511
"identifier_token": {
1612
"token_type": "IDENTIFIER",
1713
"literal": "x"
14+
},
15+
"expression": {
16+
"INTEGER": {
17+
"integer_token": {
18+
"token_type": "INTEGER",
19+
"literal": "5"
20+
}
21+
}
1822
}
1923
}
2024
}
@@ -24,13 +28,33 @@ expression: returned_abstract_syntax_tree
2428
"STATEMENT": {
2529
"statement": {
2630
"LET": {
27-
"let_token": {
28-
"token_type": "LET",
29-
"literal": "let"
30-
},
3131
"identifier_token": {
3232
"token_type": "IDENTIFIER",
3333
"literal": "z"
34+
},
35+
"expression": {
36+
"INFIX": {
37+
"left_hand_expression": {
38+
"INTEGER": {
39+
"integer_token": {
40+
"token_type": "INTEGER",
41+
"literal": "7"
42+
}
43+
}
44+
},
45+
"operator_token": {
46+
"token_type": "PLUS",
47+
"literal": "+"
48+
},
49+
"right_hand_expression": {
50+
"INTEGER": {
51+
"integer_token": {
52+
"token_type": "INTEGER",
53+
"literal": "10"
54+
}
55+
}
56+
}
57+
}
3458
}
3559
}
3660
}

src/syntax_analysis/snapshots/rust_monkey_interpreter__syntax_analysis__tests__test_syntax_analysis_for_return_statements_case1.snap

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,13 @@ expression: returned_abstract_syntax_tree
88
"STATEMENT": {
99
"statement": {
1010
"RETURN": {
11-
"return_token": {
12-
"token_type": "RETURN",
13-
"literal": "RETURN"
11+
"expression": {
12+
"INTEGER": {
13+
"integer_token": {
14+
"token_type": "INTEGER",
15+
"literal": "5"
16+
}
17+
}
1418
}
1519
}
1620
}

src/syntax_analysis/snapshots/rust_monkey_interpreter__syntax_analysis__tests__test_syntax_analysis_for_return_statements_case2.snap

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,13 @@ expression: returned_abstract_syntax_tree
88
"STATEMENT": {
99
"statement": {
1010
"RETURN": {
11-
"return_token": {
12-
"token_type": "RETURN",
13-
"literal": "RETURN"
11+
"expression": {
12+
"INTEGER": {
13+
"integer_token": {
14+
"token_type": "INTEGER",
15+
"literal": "5"
16+
}
17+
}
1418
}
1519
}
1620
}
@@ -20,9 +24,13 @@ expression: returned_abstract_syntax_tree
2024
"STATEMENT": {
2125
"statement": {
2226
"RETURN": {
23-
"return_token": {
24-
"token_type": "RETURN",
25-
"literal": "return"
27+
"expression": {
28+
"IDENTIFIER": {
29+
"identifier_token": {
30+
"token_type": "IDENTIFIER",
31+
"literal": "x"
32+
}
33+
}
2634
}
2735
}
2836
}

0 commit comments

Comments
 (0)