Move bx! macro up to mod.rs
And make use of it in parser
This commit is contained in:
parent
e86d401c90
commit
75ecfb4e86
@ -1,6 +1,11 @@
|
|||||||
use itertools::Itertools;
|
use itertools::Itertools;
|
||||||
use schala_lib::{ProgrammingLanguageInterface, EvalOptions, TraceArtifact, ReplOutput};
|
use schala_lib::{ProgrammingLanguageInterface, EvalOptions, TraceArtifact, ReplOutput};
|
||||||
|
|
||||||
|
macro_rules! bx {
|
||||||
|
($e:expr) => { Box::new($e) }
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
mod tokenizing;
|
mod tokenizing;
|
||||||
mod parsing;
|
mod parsing;
|
||||||
//mod type_check;
|
//mod type_check;
|
||||||
|
@ -568,7 +568,7 @@ impl Parser {
|
|||||||
};
|
};
|
||||||
let rhs = self.precedence_expr(new_precedence)?;
|
let rhs = self.precedence_expr(new_precedence)?;
|
||||||
let operation = Operation(op_str);
|
let operation = Operation(op_str);
|
||||||
lhs = Expression(ExpressionType::BinExp(operation, Box::new(lhs), Box::new(rhs)), None);
|
lhs = Expression(ExpressionType::BinExp(operation, bx!(lhs), bx!(rhs)), None);
|
||||||
}
|
}
|
||||||
self.parse_level -= 1;
|
self.parse_level -= 1;
|
||||||
Ok(lhs)
|
Ok(lhs)
|
||||||
@ -583,7 +583,7 @@ impl Parser {
|
|||||||
};
|
};
|
||||||
let expr = self.primary()?;
|
let expr = self.primary()?;
|
||||||
Ok(Expression(
|
Ok(Expression(
|
||||||
ExpressionType::PrefixExp(Operation(op_str), Box::new(expr)),
|
ExpressionType::PrefixExp(Operation(op_str), bx!(expr)),
|
||||||
None))
|
None))
|
||||||
},
|
},
|
||||||
_ => self.primary()
|
_ => self.primary()
|
||||||
@ -628,13 +628,13 @@ impl Parser {
|
|||||||
LParen => {
|
LParen => {
|
||||||
let arguments = self.call_expr()?;
|
let arguments = self.call_expr()?;
|
||||||
//TODO make this be more general
|
//TODO make this be more general
|
||||||
let f = Box::new(Expression(Value(identifier, vec![]), None));
|
let f = bx!(Expression(Value(identifier, vec![]), None));
|
||||||
Expression(Call { f, arguments }, None)
|
Expression(Call { f, arguments }, None)
|
||||||
},
|
},
|
||||||
LSquareBracket => {
|
LSquareBracket => {
|
||||||
let indexers = self.index_expr()?;
|
let indexers = self.index_expr()?;
|
||||||
Expression(Index {
|
Expression(Index {
|
||||||
indexee: Box::new(Expression(Value(identifier, vec![]), None)),
|
indexee: bx!(Expression(Value(identifier, vec![]), None)),
|
||||||
indexers,
|
indexers,
|
||||||
}, None)
|
}, None)
|
||||||
}
|
}
|
||||||
@ -671,7 +671,7 @@ impl Parser {
|
|||||||
})()?;
|
})()?;
|
||||||
let then_clause = self.block()?;
|
let then_clause = self.block()?;
|
||||||
let else_clause = self.else_clause()?;
|
let else_clause = self.else_clause()?;
|
||||||
Ok(Expression(ExpressionType::IfExpression(Box::new(condition), then_clause, else_clause), None))
|
Ok(Expression(ExpressionType::IfExpression(bx!(condition), then_clause, else_clause), None))
|
||||||
});
|
});
|
||||||
|
|
||||||
parse_method!(else_clause(&mut self) -> ParseResult<Option<Vec<Statement>>> {
|
parse_method!(else_clause(&mut self) -> ParseResult<Option<Vec<Statement>>> {
|
||||||
@ -694,7 +694,7 @@ impl Parser {
|
|||||||
//expect!(self, LCurlyBrace, "Expected '{'");
|
//expect!(self, LCurlyBrace, "Expected '{'");
|
||||||
let body = self.match_body()?;
|
let body = self.match_body()?;
|
||||||
//expect!(self, RCurlyBrace, "Expected '}'");
|
//expect!(self, RCurlyBrace, "Expected '}'");
|
||||||
Ok(Expression(ExpressionType::MatchExpression(Box::new(expr), body), None))
|
Ok(Expression(ExpressionType::MatchExpression(bx!(expr), body), None))
|
||||||
});
|
});
|
||||||
|
|
||||||
parse_method!(match_body(&mut self) -> ParseResult<Vec<MatchArm>> {
|
parse_method!(match_body(&mut self) -> ParseResult<Vec<MatchArm>> {
|
||||||
@ -871,10 +871,10 @@ mod parse_tests {
|
|||||||
($string:expr) => { assert!(parse(tokenize($string)).0.is_err()) }
|
($string:expr) => { assert!(parse(tokenize($string)).0.is_err()) }
|
||||||
}
|
}
|
||||||
macro_rules! binexp {
|
macro_rules! binexp {
|
||||||
($op:expr, $lhs:expr, $rhs:expr) => { BinExp(op!($op), Box::new(Expression($lhs, None)), Box::new(Expression($rhs, None))) }
|
($op:expr, $lhs:expr, $rhs:expr) => { BinExp(op!($op), bx!(Expression($lhs, None)), bx!(Expression($rhs, None))) }
|
||||||
}
|
}
|
||||||
macro_rules! prefexp {
|
macro_rules! prefexp {
|
||||||
($op:expr, $lhs:expr) => { PrefixExp(op!($op), Box::new(Expression($lhs, None))) }
|
($op:expr, $lhs:expr) => { PrefixExp(op!($op), bx!(Expression($lhs, None))) }
|
||||||
}
|
}
|
||||||
macro_rules! op {
|
macro_rules! op {
|
||||||
($op:expr) => { Operation(Rc::new($op.to_string())) }
|
($op:expr) => { Operation(Rc::new($op.to_string())) }
|
||||||
@ -957,7 +957,7 @@ mod parse_tests {
|
|||||||
//parse_test!("a[b]", AST(vec![Expression(
|
//parse_test!("a[b]", AST(vec![Expression(
|
||||||
//parse_test!("a[]", <- TODO THIS NEEDS TO FAIL
|
//parse_test!("a[]", <- TODO THIS NEEDS TO FAIL
|
||||||
//parse_test!(damn()[a] ,<- TODO needs to succeed
|
//parse_test!(damn()[a] ,<- TODO needs to succeed
|
||||||
parse_test!("a[b,c]", AST(vec![exprstatement!(Index { indexee: Box::new(ex!(val!("a"))), indexers: vec![ex!(val!("b")), ex!(val!("c"))]} )]));
|
parse_test!("a[b,c]", AST(vec![exprstatement!(Index { indexee: bx!(ex!(val!("a"))), indexers: vec![ex!(val!("b")), ex!(val!("c"))]} )]));
|
||||||
|
|
||||||
parse_test!("None", AST(vec![exprstatement!(val!("None"))]));
|
parse_test!("None", AST(vec![exprstatement!(val!("None"))]));
|
||||||
parse_test!("Pandas { a: x + y }", AST(vec![
|
parse_test!("Pandas { a: x + y }", AST(vec![
|
||||||
@ -984,9 +984,9 @@ mod parse_tests {
|
|||||||
#[test]
|
#[test]
|
||||||
fn parsing_functions() {
|
fn parsing_functions() {
|
||||||
parse_test!("fn oi()", AST(vec![Declaration(FuncSig(Signature { name: rc!(oi), params: vec![], type_anno: None }))]));
|
parse_test!("fn oi()", AST(vec![Declaration(FuncSig(Signature { name: rc!(oi), params: vec![], type_anno: None }))]));
|
||||||
parse_test!("oi()", AST(vec![exprstatement!(Call { f: Box::new(ex!(val!("oi"))), arguments: vec![] })]));
|
parse_test!("oi()", AST(vec![exprstatement!(Call { f: bx!(ex!(val!("oi"))), arguments: vec![] })]));
|
||||||
parse_test!("oi(a, 2 + 2)", AST(vec![exprstatement!(Call
|
parse_test!("oi(a, 2 + 2)", AST(vec![exprstatement!(Call
|
||||||
{ f: Box::new(ex!(val!("oi"))),
|
{ f: bx!(ex!(val!("oi"))),
|
||||||
arguments: vec![ex!(val!("a")), ex!(binexp!("+", IntLiteral(2), IntLiteral(2)))]
|
arguments: vec![ex!(val!("a")), ex!(binexp!("+", IntLiteral(2), IntLiteral(2)))]
|
||||||
})]));
|
})]));
|
||||||
parse_error!("a(b,,c)");
|
parse_error!("a(b,,c)");
|
||||||
@ -999,7 +999,7 @@ mod parse_tests {
|
|||||||
|
|
||||||
parse_test!("fn a(x) { x() }", AST(vec![Declaration(
|
parse_test!("fn a(x) { x() }", AST(vec![Declaration(
|
||||||
FuncDecl(Signature { name: rc!(a), params: vec![(rc!(x),None)], type_anno: None },
|
FuncDecl(Signature { name: rc!(a), params: vec![(rc!(x),None)], type_anno: None },
|
||||||
vec![exprstatement!(Call { f: Box::new(ex!(val!("x"))), arguments: vec![] })]))]));
|
vec![exprstatement!(Call { f: bx!(ex!(val!("x"))), arguments: vec![] })]))]));
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
@ -1045,8 +1045,8 @@ mod parse_tests {
|
|||||||
#[test]
|
#[test]
|
||||||
fn parsing_block_expressions() {
|
fn parsing_block_expressions() {
|
||||||
parse_test!("if a() { b(); c() }", AST(vec![exprstatement!(
|
parse_test!("if a() { b(); c() }", AST(vec![exprstatement!(
|
||||||
IfExpression(Box::new(ex!(Call { f: Box::new(ex!(val!("a"))), arguments: vec![]})),
|
IfExpression(bx!(ex!(Call { f: bx!(ex!(val!("a"))), arguments: vec![]})),
|
||||||
vec![exprstatement!(Call { f: Box::new(ex!(val!("b"))), arguments: vec![]}), exprstatement!(Call { f: Box::new(ex!(val!("c"))), arguments: vec![] })],
|
vec![exprstatement!(Call { f: bx!(ex!(val!("b"))), arguments: vec![]}), exprstatement!(Call { f: bx!(ex!(val!("c"))), arguments: vec![] })],
|
||||||
None)
|
None)
|
||||||
)]));
|
)]));
|
||||||
parse_test!(r#"
|
parse_test!(r#"
|
||||||
@ -1056,19 +1056,19 @@ mod parse_tests {
|
|||||||
} else {
|
} else {
|
||||||
c
|
c
|
||||||
}"#,
|
}"#,
|
||||||
AST(vec![exprstatement!(IfExpression(Box::new(ex!(BoolLiteral(true))),
|
AST(vec![exprstatement!(IfExpression(bx!(ex!(BoolLiteral(true))),
|
||||||
vec![Declaration(Binding { name: rc!(a), constant: true, expr: ex!(IntLiteral(10)) }),
|
vec![Declaration(Binding { name: rc!(a), constant: true, expr: ex!(IntLiteral(10)) }),
|
||||||
exprstatement!(Value(rc!(b), vec![]))],
|
exprstatement!(Value(rc!(b), vec![]))],
|
||||||
Some(vec![exprstatement!(Value(rc!(c), vec![]))])))])
|
Some(vec![exprstatement!(Value(rc!(c), vec![]))])))])
|
||||||
);
|
);
|
||||||
|
|
||||||
parse_test!("if a { b } else { c }", AST(vec![exprstatement!(
|
parse_test!("if a { b } else { c }", AST(vec![exprstatement!(
|
||||||
IfExpression(Box::new(ex!(val!("a"))),
|
IfExpression(bx!(ex!(val!("a"))),
|
||||||
vec![exprstatement!(val!("b"))],
|
vec![exprstatement!(val!("b"))],
|
||||||
Some(vec![exprstatement!(val!("c"))])))]));
|
Some(vec![exprstatement!(val!("c"))])))]));
|
||||||
|
|
||||||
parse_test!("if (A {a: 1}) { b } else { c }", AST(vec![exprstatement!(
|
parse_test!("if (A {a: 1}) { b } else { c }", AST(vec![exprstatement!(
|
||||||
IfExpression(Box::new(ex!(Value(rc!(A), vec![(rc!(a), ex!(IntLiteral(1)))]))),
|
IfExpression(bx!(ex!(Value(rc!(A), vec![(rc!(a), ex!(IntLiteral(1)))]))),
|
||||||
vec![exprstatement!(val!("b"))],
|
vec![exprstatement!(val!("b"))],
|
||||||
Some(vec![exprstatement!(val!("c"))])))]));
|
Some(vec![exprstatement!(val!("c"))])))]));
|
||||||
|
|
||||||
|
@ -1,10 +1,6 @@
|
|||||||
use std::rc::Rc;
|
use std::rc::Rc;
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
|
|
||||||
macro_rules! bx {
|
|
||||||
($e:expr) => { Box::new($e) }
|
|
||||||
}
|
|
||||||
|
|
||||||
use schala_lang::parsing;
|
use schala_lang::parsing;
|
||||||
|
|
||||||
pub struct TypeContext {
|
pub struct TypeContext {
|
||||||
@ -115,7 +111,6 @@ impl TypeContext {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
/*
|
/*
|
||||||
BinExp(Operation, Box<Expression>, Box<Expression>),
|
|
||||||
PrefixExp(Operation, Box<Expression>),
|
PrefixExp(Operation, Box<Expression>),
|
||||||
TupleLiteral(Vec<Expression>),
|
TupleLiteral(Vec<Expression>),
|
||||||
Value(Rc<String>, Vec<(Rc<String>, Expression)>),
|
Value(Rc<String>, Vec<(Rc<String>, Expression)>),
|
||||||
|
Loading…
Reference in New Issue
Block a user