Skip to content

Commit 59e3f29

Browse files
added lambda expression parser
1 parent 9076da0 commit 59e3f29

4 files changed

Lines changed: 63 additions & 5 deletions

File tree

src/ir/ast.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,9 @@ pub enum Expression {
116116
IsNothing(Box<Expression>),
117117
Propagate(Box<Expression>),
118118

119+
//Lambda expression
120+
Lambda(Function),
121+
119122
// List value
120123
ListValue(Vec<Expression>),
121124

src/parser/parser_common.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ pub const ASSERT_KEYWORD: &str = "assert";
3636
pub const VAR_KEYWORD: &str = "var";
3737
pub const VAL_KEYWORD: &str = "val";
3838
pub const DEF_KEYWORD: &str = "def";
39+
pub const LAMBDA_KEYWORD: &str = "lambda";
40+
pub const RET_KEYWORD: &str = "return";
3941

4042
// Operator and symbol constants
4143
pub const FUNCTION_ARROW: &str = "->";

src/parser/parser_expr.rs

Lines changed: 43 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use nom::{
22
branch::alt,
33
bytes::complete::{tag, take_while},
4-
character::complete::{char, digit1, multispace0},
4+
character::complete::{char, digit1, multispace0, multispace1},
55
combinator::{map, map_res, opt, value, verify},
66
error::Error,
77
multi::{fold_many0, separated_list0},
@@ -11,19 +11,26 @@ use nom::{
1111

1212
use std::str::FromStr;
1313

14-
use crate::ir::ast::Expression;
14+
use crate::{ir::ast::Expression, parser::{parser_common::END_KEYWORD}};
1515
use crate::parser::parser_common::{
1616
identifier,
1717
is_string_char,
1818
keyword,
1919
// Other character constants
2020
COMMA_CHAR,
21+
COLON_CHAR,
2122
// Bracket and parentheses constants
2223
LEFT_BRACKET,
2324
LEFT_PAREN,
2425
RIGHT_BRACKET,
2526
RIGHT_PAREN,
27+
FUNCTION_ARROW,
28+
LAMBDA_KEYWORD,
2629
};
30+
use crate::parser::parser_stmt::{parse_formal_argument, parse_return_statement};
31+
use crate::parser::parser_type::parse_type;
32+
use crate::ir::ast::Function;
33+
use crate::ir::ast::Statement;
2734

2835
pub fn parse_expression(input: &str) -> IResult<&str, Expression> {
2936
parse_or(input)
@@ -117,6 +124,7 @@ fn parse_factor(input: &str) -> IResult<&str, Expression> {
117124
parse_list,
118125
parse_function_call,
119126
parse_var,
127+
parse_lambda,
120128
delimited(
121129
char::<&str, Error<&str>>(LEFT_PAREN),
122130
parse_expression,
@@ -125,6 +133,39 @@ fn parse_factor(input: &str) -> IResult<&str, Expression> {
125133
))(input)
126134
}
127135

136+
fn parse_lambda(input: &str) -> IResult<&str, Expression> {
137+
map(
138+
tuple((
139+
keyword(LAMBDA_KEYWORD),
140+
preceded(multispace1, identifier),
141+
delimited(
142+
char::<&str, Error<&str>>(LEFT_PAREN),
143+
separated_list0(
144+
tuple((
145+
multispace0,
146+
char::<&str, Error<&str>>(COMMA_CHAR),
147+
multispace0,
148+
)),
149+
parse_formal_argument,
150+
),
151+
char::<&str, Error<&str>>(RIGHT_PAREN),
152+
),
153+
preceded(multispace0, tag(FUNCTION_ARROW)),
154+
delimited(multispace0, parse_type, char::<&str, Error<&str>>(COLON_CHAR)),
155+
parse_return_statement,
156+
keyword(END_KEYWORD)
157+
)),
158+
|(_, name, args, _, t, return_stmt, _)| {
159+
Expression::Lambda(Function {
160+
name: name.to_string(),
161+
kind: t,
162+
params: args,
163+
body: Some(Box::new(Statement::Block(vec![return_stmt]))),
164+
})
165+
},
166+
)(input)
167+
}
168+
128169
fn parse_bool(input: &str) -> IResult<&str, Expression> {
129170
alt((
130171
value(Expression::CTrue, keyword("True")),

src/parser/parser_stmt.rs

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ use crate::ir::ast::{FormalArgument, Function, Statement};
1313
use crate::parser::parser_common::{
1414
identifier, keyword, ASSERT_KEYWORD, COLON_CHAR, COMMA_CHAR, DEF_KEYWORD, ELSE_KEYWORD,
1515
END_KEYWORD, EQUALS_CHAR, FOR_KEYWORD, FUNCTION_ARROW, IF_KEYWORD, IN_KEYWORD, LEFT_PAREN,
16-
RIGHT_PAREN, SEMICOLON_CHAR, VAL_KEYWORD, VAR_KEYWORD, WHILE_KEYWORD,
16+
RIGHT_PAREN, SEMICOLON_CHAR, VAL_KEYWORD, VAR_KEYWORD, WHILE_KEYWORD, RET_KEYWORD
1717
};
1818
use crate::parser::parser_expr::parse_expression;
1919
use crate::parser::parser_type::parse_type;
@@ -28,9 +28,21 @@ pub fn parse_statement(input: &str) -> IResult<&str, Statement> {
2828
parse_for_statement,
2929
parse_assert_statement,
3030
parse_function_definition_statement,
31+
parse_return_statement,
3132
))(input)
3233
}
3334

35+
pub fn parse_return_statement(input: &str) -> IResult<&str, Statement> {
36+
map(
37+
tuple((
38+
keyword(RET_KEYWORD),
39+
multispace0,
40+
parse_expression,
41+
)),
42+
|(_, _, expr)| Statement::Return(Box::new(expr)),
43+
)(input)
44+
}
45+
3446
fn parse_var_declaration_statement(input: &str) -> IResult<&str, Statement> {
3547
map(
3648
tuple((
@@ -181,7 +193,7 @@ fn parse_function_definition_statement(input: &str) -> IResult<&str, Statement>
181193
)(input)
182194
}
183195

184-
fn parse_block(input: &str) -> IResult<&str, Statement> {
196+
pub fn parse_block(input: &str) -> IResult<&str, Statement> {
185197
map(
186198
tuple((
187199
char::<&str, Error<&str>>(COLON_CHAR),
@@ -204,7 +216,7 @@ fn parse_block(input: &str) -> IResult<&str, Statement> {
204216
)(input)
205217
}
206218

207-
fn parse_formal_argument(input: &str) -> IResult<&str, FormalArgument> {
219+
pub fn parse_formal_argument(input: &str) -> IResult<&str, FormalArgument> {
208220
map(
209221
tuple((
210222
preceded(multispace0, identifier),

0 commit comments

Comments
 (0)