mirror of
https://github.com/azur1s/bobbylisp.git
synced 2024-10-16 02:37:40 -05:00
return statement
This commit is contained in:
parent
826092c54b
commit
a3376f2492
|
@ -1,4 +1,5 @@
|
||||||
func join :: (a, b) = {
|
func join :: (a, b) = {
|
||||||
let result :: String = from(a, b);
|
let result :: String = from(a, b);
|
||||||
|
return result;
|
||||||
};
|
};
|
||||||
let foo :: String = join("f", "oo");
|
let foo :: String = join("f", "oo");
|
|
@ -94,6 +94,7 @@ fn lex_reserved_identifier(input: &Bytes) -> IResult<&Bytes, Token> {
|
||||||
"else" => Token::Else,
|
"else" => Token::Else,
|
||||||
"let" => Token::Let,
|
"let" => Token::Let,
|
||||||
"func" => Token::Func,
|
"func" => Token::Func,
|
||||||
|
"return" => Token::Return,
|
||||||
"true" => Token::Bool(true),
|
"true" => Token::Bool(true),
|
||||||
"false" => Token::Bool(false),
|
"false" => Token::Bool(false),
|
||||||
_ => Token::Identifier(syntax.to_string()),
|
_ => Token::Identifier(syntax.to_string()),
|
||||||
|
|
|
@ -18,7 +18,7 @@ pub enum Token {
|
||||||
LBrace, RBrace,
|
LBrace, RBrace,
|
||||||
Semicolon, Colon, Comma,
|
Semicolon, Colon, Comma,
|
||||||
|
|
||||||
If, Else, Let, Func,
|
If, Else, Let, Func, Return,
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Token struct with position information.
|
/// Token struct with position information.
|
||||||
|
@ -103,6 +103,7 @@ pub enum Stmt {
|
||||||
Let(Ident, Ident, Expr),
|
Let(Ident, Ident, Expr),
|
||||||
Func(Ident, Vec<Ident>, Vec<Stmt>),
|
Func(Ident, Vec<Ident>, Vec<Stmt>),
|
||||||
Call(Ident, Vec<Expr>),
|
Call(Ident, Vec<Expr>),
|
||||||
|
Return(Expr),
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Debug, PartialEq)]
|
#[derive(Clone, Debug, PartialEq)]
|
||||||
|
|
|
@ -21,6 +21,8 @@ macro_rules! tag_token (
|
||||||
|
|
||||||
tag_token!(tag_let, Token::Let);
|
tag_token!(tag_let, Token::Let);
|
||||||
tag_token!(tag_func, Token::Func);
|
tag_token!(tag_func, Token::Func);
|
||||||
|
tag_token!(tag_return, Token::Return);
|
||||||
|
|
||||||
tag_token!(tag_assign, Token::Assign);
|
tag_token!(tag_assign, Token::Assign);
|
||||||
tag_token!(tag_typehint, Token::Typehint);
|
tag_token!(tag_typehint, Token::Typehint);
|
||||||
tag_token!(tag_semicolon, Token::Semicolon);
|
tag_token!(tag_semicolon, Token::Semicolon);
|
||||||
|
@ -148,6 +150,17 @@ fn parse_expr_lowest(input: Tokens) -> IResult<Tokens, Expr> {
|
||||||
parse_expr_with(input, Precedence::Lowest)
|
parse_expr_with(input, Precedence::Lowest)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn parse_return_stmt(input: Tokens) -> IResult<Tokens, Stmt> {
|
||||||
|
map(
|
||||||
|
delimited(
|
||||||
|
tag_return,
|
||||||
|
parse_expr_lowest,
|
||||||
|
tag_semicolon,
|
||||||
|
),
|
||||||
|
Stmt::Return,
|
||||||
|
)(input)
|
||||||
|
}
|
||||||
|
|
||||||
fn parse_call_stmt(input: Tokens) -> IResult<Tokens, Stmt> {
|
fn parse_call_stmt(input: Tokens) -> IResult<Tokens, Stmt> {
|
||||||
map(
|
map(
|
||||||
tuple((
|
tuple((
|
||||||
|
@ -202,6 +215,7 @@ fn parse_stmt(input: Tokens) -> IResult<Tokens, Stmt> {
|
||||||
parse_let_stmt,
|
parse_let_stmt,
|
||||||
parse_func_stmt,
|
parse_func_stmt,
|
||||||
parse_call_stmt,
|
parse_call_stmt,
|
||||||
|
parse_return_stmt,
|
||||||
))(input)
|
))(input)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue