a few more things
This commit is contained in:
parent
290dcab5e9
commit
8b677c037b
3 changed files with 83 additions and 40 deletions
|
|
@ -1,46 +1,6 @@
|
||||||
use super::types::*;
|
use super::types::*;
|
||||||
use crate::ast;
|
use crate::ast;
|
||||||
|
|
||||||
fn parse_expr(tokens: &mut Tokens) -> ParseResult<ast::Expr> {
|
|
||||||
todo!()
|
|
||||||
}
|
|
||||||
|
|
||||||
fn parse_simple_expr(tokens: &mut Tokens) -> ParseResult<ast::Expr> {
|
|
||||||
tokens.one_of(vec![
|
|
||||||
|t| t.between(Token::OpenParen, Token::CloseParen, parse_expr),
|
|
||||||
parse_number,
|
|
||||||
|_| Err(Error::UnexpectedEndOfInput),
|
|
||||||
])
|
|
||||||
}
|
|
||||||
|
|
||||||
fn parse_string(tokens: &mut Tokens) -> ParseResult<ast::Expr> {
|
|
||||||
{
|
|
||||||
if let Some(LocatedToken {
|
|
||||||
token: Token::String(string),
|
|
||||||
..
|
|
||||||
}) = tokens.next_if(Token::String("".into()))
|
|
||||||
{
|
|
||||||
Ok(Some(ast::Expr::Value(ast::Value::String(string))))
|
|
||||||
} else {
|
|
||||||
Ok(None)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn parse_number(tokens: &mut Tokens) -> ParseResult<ast::Expr> {
|
|
||||||
{
|
|
||||||
if let Some(LocatedToken {
|
|
||||||
token: Token::Number(number),
|
|
||||||
..
|
|
||||||
}) = tokens.next_if(Token::Number(0))
|
|
||||||
{
|
|
||||||
Ok(Some(ast::Expr::Value(ast::Value::Int(number.into()))))
|
|
||||||
} else {
|
|
||||||
Ok(None)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn parse_definition(tokens: &mut Tokens) -> Result<ast::Definition, Error> {
|
fn parse_definition(tokens: &mut Tokens) -> Result<ast::Definition, Error> {
|
||||||
if let Some(start) = tokens.next_if(Token::Let) {
|
if let Some(start) = tokens.next_if(Token::Let) {
|
||||||
if let Some(LocatedToken {
|
if let Some(LocatedToken {
|
||||||
|
|
@ -76,3 +36,82 @@ fn parse_definition(tokens: &mut Tokens) -> Result<ast::Definition, Error> {
|
||||||
Err(Error::UnexpectedEndOfInput)
|
Err(Error::UnexpectedEndOfInput)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn parse_expr(tokens: &mut Tokens) -> ParseResult<ast::Expr> {
|
||||||
|
parse_simple_expr(tokens)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn parse_simple_expr(tokens: &mut Tokens) -> ParseResult<ast::Expr> {
|
||||||
|
tokens.one_of(vec![
|
||||||
|
|t| t.between(Token::OpenParen, Token::CloseParen, parse_expr),
|
||||||
|
parse_identifier,
|
||||||
|
parse_number,
|
||||||
|
parse_string,
|
||||||
|
parse_bool,
|
||||||
|
])
|
||||||
|
}
|
||||||
|
|
||||||
|
fn parse_string(tokens: &mut Tokens) -> ParseResult<ast::Expr> {
|
||||||
|
{
|
||||||
|
if let Some(LocatedToken {
|
||||||
|
token: Token::String(string),
|
||||||
|
..
|
||||||
|
}) = tokens.next_if(Token::String("".into()))
|
||||||
|
{
|
||||||
|
Ok(Some(ast::Expr::Value(ast::Value::String(string))))
|
||||||
|
} else {
|
||||||
|
Ok(None)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn parse_number(tokens: &mut Tokens) -> ParseResult<ast::Expr> {
|
||||||
|
{
|
||||||
|
if let Some(LocatedToken {
|
||||||
|
token: Token::Number(number),
|
||||||
|
..
|
||||||
|
}) = tokens.next_if(Token::Number(0))
|
||||||
|
{
|
||||||
|
Ok(Some(ast::Expr::Value(ast::Value::Int(number.into()))))
|
||||||
|
} else {
|
||||||
|
Ok(None)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn parse_identifier(tokens: &mut Tokens) -> ParseResult<ast::Expr> {
|
||||||
|
{
|
||||||
|
if let Some(LocatedToken {
|
||||||
|
token: Token::Identifier(string),
|
||||||
|
..
|
||||||
|
}) = tokens.next_if(Token::String("".into()))
|
||||||
|
{
|
||||||
|
Ok(Some(ast::Expr::Var(ast::Name(string))))
|
||||||
|
} else {
|
||||||
|
Ok(None)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn parse_bool(tokens: &mut Tokens) -> ParseResult<ast::Expr> {
|
||||||
|
tokens.one_of(vec![
|
||||||
|
|t| {
|
||||||
|
Ok({
|
||||||
|
if let Some(_) = t.next_if(Token::True) {
|
||||||
|
Some(ast::Expr::Value(ast::Value::Boolean(true)))
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|t| {
|
||||||
|
Ok({
|
||||||
|
if let Some(_) = t.next_if(Token::False) {
|
||||||
|
Some(ast::Expr::Value(ast::Value::Boolean(false)))
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
])
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -137,6 +137,8 @@ fn scan(source: String) -> Vec<LocatedToken> {
|
||||||
"fn" => Token::Fn,
|
"fn" => Token::Fn,
|
||||||
"let" => Token::Let,
|
"let" => Token::Let,
|
||||||
"return" => Token::Return,
|
"return" => Token::Return,
|
||||||
|
"true" => Token::True,
|
||||||
|
"false" => Token::False,
|
||||||
_ => Token::Identifier(str),
|
_ => Token::Identifier(str),
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -21,6 +21,8 @@ pub enum Token {
|
||||||
Comma,
|
Comma,
|
||||||
Semicolon,
|
Semicolon,
|
||||||
Colon,
|
Colon,
|
||||||
|
True,
|
||||||
|
False,
|
||||||
Number(u32),
|
Number(u32),
|
||||||
String(String),
|
String(String),
|
||||||
Identifier(String),
|
Identifier(String),
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue