forked from AbleScript/ablescript
Implemented function calls
This commit is contained in:
parent
27a8de70fa
commit
5c00446c59
|
@ -1 +1 @@
|
||||||
a()
|
a(3,)
|
|
@ -2,9 +2,15 @@ use std::collections::HashMap;
|
||||||
|
|
||||||
use crate::variables::Value;
|
use crate::variables::Value;
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone, Hash, PartialEq, Eq)]
|
||||||
pub struct Iden(pub String);
|
pub struct Iden(pub String);
|
||||||
|
|
||||||
|
impl From<Iden> for Expr {
|
||||||
|
fn from(iden: Iden) -> Self {
|
||||||
|
Self::Identifier(iden)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
pub enum Expr {
|
pub enum Expr {
|
||||||
VariableDeclaration {
|
VariableDeclaration {
|
||||||
|
@ -27,8 +33,9 @@ pub enum Expr {
|
||||||
|
|
||||||
FunctionCall {
|
FunctionCall {
|
||||||
iden: Iden,
|
iden: Iden,
|
||||||
args: HashMap<Iden, Value>,
|
args: Vec<Expr>,
|
||||||
},
|
},
|
||||||
Literal(Value),
|
Literal(Value),
|
||||||
|
Identifier(Iden),
|
||||||
Melo(Iden),
|
Melo(Iden),
|
||||||
}
|
}
|
||||||
|
|
|
@ -142,9 +142,6 @@ impl<'a> Parser<'a> {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
if token == Token::RightBrace {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
body.push_str(match token {
|
body.push_str(match token {
|
||||||
Token::OpGt
|
Token::OpGt
|
||||||
| Token::OpLt
|
| Token::OpLt
|
||||||
|
|
|
@ -22,10 +22,25 @@ impl<'a> Parser<'a> {
|
||||||
|
|
||||||
fn fn_call(&mut self, iden: Iden) -> Result<Expr, Error> {
|
fn fn_call(&mut self, iden: Iden) -> Result<Expr, Error> {
|
||||||
self.lexer.next();
|
self.lexer.next();
|
||||||
|
let mut args: Vec<Expr> = Vec::new();
|
||||||
|
while let Some(token) = self.lexer.peek() {
|
||||||
|
match token {
|
||||||
|
Token::Identifier(id) => {
|
||||||
|
args.push(Iden(id.clone()).into());
|
||||||
|
self.lexer.next();
|
||||||
|
}
|
||||||
|
Token::RightParenthesis => break,
|
||||||
|
_ => {
|
||||||
|
let next = self.lexer.next();
|
||||||
|
args.push(self.parse_expr(next)?)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
self.require(Token::Comma)?;
|
||||||
|
}
|
||||||
self.require(Token::RightParenthesis)?;
|
self.require(Token::RightParenthesis)?;
|
||||||
Ok(Expr::FunctionCall {
|
Ok(Expr::FunctionCall {
|
||||||
iden,
|
iden,
|
||||||
args: HashMap::new(),
|
args,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,6 +23,7 @@ pub enum Value {
|
||||||
Int(i32),
|
Int(i32),
|
||||||
Bool(bool),
|
Bool(bool),
|
||||||
Abool(Abool),
|
Abool(Abool),
|
||||||
|
Nul,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
|
|
Loading…
Reference in a new issue