main
annieversary 2021-09-26 17:36:06 +02:00
parent a66e769b5a
commit 7ed7c03352
2 changed files with 70 additions and 14 deletions

View File

@ -2,7 +2,7 @@ mod ast;
mod parser; mod parser;
fn main() { fn main() {
let a = r#"funFun("ss" + 12, true)"#; let a = r#"1 + a < 9 - <- chan"#;
let (rest, res) = parser::expr(a).unwrap(); let (rest, res) = parser::expr(a).unwrap();
dbg!(res); dbg!(res);
dbg!(rest); dbg!(rest);

View File

@ -110,9 +110,16 @@ fn literal(i: &str) -> IResult<&str, Expr> {
println!("literal: {}", i); println!("literal: {}", i);
alt((num, string, map(tag("null"), |_| Expr::LNull), boolean))(i) alt((num, string, map(tag("null"), |_| Expr::LNull), boolean))(i)
} }
fn receive<'a>(i: &'a str) -> IResult<&'a str, Expr> {
println!("receive: {}", i);
map(tuple((sc, tag("<-"), expr)), |(_, _, expr)| {
Expr::Receive(Box::new(expr))
})(i)
}
fn factor_bin(i: &str) -> IResult<&str, Expr> { fn factor_bin(i: &str) -> IResult<&str, Expr> {
alt((delimited(space0, term, space0), expr))(i) println!("factor bin: {}", i);
alt((delimited(space0, alt((receive, term)), space0), expr))(i)
} }
fn bin_less_greater(i: &str) -> IResult<&str, Expr> { fn bin_less_greater(i: &str) -> IResult<&str, Expr> {
@ -176,22 +183,16 @@ fn binary<'a>(i: &'a str) -> IResult<&'a str, Expr> {
}, },
)(i) )(i)
} }
fn receive<'a>(i: &'a str) -> IResult<&'a str, Expr> {
println!("receive: {}", i);
map(pair(tag("<-"), expr), |(_, expr)| {
Expr::Receive(Box::new(expr))
})(i)
}
pub fn expr<'a>(i: &'a str) -> IResult<&'a str, Expr> {
alt((receive, binary))(i)
}
fn term<'a>(i: &'a str) -> IResult<&'a str, Expr> { fn term<'a>(i: &'a str) -> IResult<&'a str, Expr> {
println!("expr: {}", i); println!("expr: {}", i);
delimited(sc, alt((literal, call, variable, parens(expr))), sc)(i) delimited(sc, alt((literal, call, variable, parens(expr))), sc)(i)
} }
pub fn expr<'a>(i: &'a str) -> IResult<&'a str, Expr> {
binary(i)
}
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use super::*; use super::*;
@ -321,7 +322,7 @@ mod tests {
#[test] #[test]
fn can_parse_call_with_string_binop() { fn can_parse_call_with_string_binop() {
let a = r#"funFun("ss" + 12, true)"#; let a = r#"funFun(null == "ss" + 12, true)"#;
let (rest, res) = expr(a).unwrap(); let (rest, res) = expr(a).unwrap();
assert_eq!( assert_eq!(
@ -331,7 +332,11 @@ mod tests {
vec![ vec![
Expr::Binary( Expr::Binary(
BinOp::Plus, BinOp::Plus,
Box::new(Expr::LStr("ss".to_string())), Box::new(Expr::Binary(
BinOp::Equals,
Box::new(Expr::LNull),
Box::new(Expr::LStr("ss".to_string())),
)),
Box::new(Expr::LNum(12.0)) Box::new(Expr::LNum(12.0))
), ),
Expr::LBool(true) Expr::LBool(true)
@ -340,4 +345,55 @@ mod tests {
); );
assert_eq!(rest, ""); assert_eq!(rest, "");
} }
#[test]
fn can_parse_binop_with_receive() {
let a = r#"1 + a < 9 - <- chan"#;
let (rest, res) = expr(a).unwrap();
assert_eq!(
res,
Expr::Binary(
BinOp::Minus,
Box::new(Expr::Binary(
BinOp::Plus,
Box::new(Expr::LNum(1.0)),
Box::new(Expr::Binary(
BinOp::LessThan,
Box::new(Expr::Var("a".to_string())),
Box::new(Expr::LNum(9.0)),
)),
)),
Box::new(Expr::Receive(Box::new(Expr::Var("chan".to_string())))),
)
);
assert_eq!(rest, "");
}
#[test]
fn can_parse_binop_with_receive_and_fun_call() {
let a = r#"-99 - <- chan + funkyFun(a, false, "hey")"#;
let (rest, res) = expr(a).unwrap();
assert_eq!(
res,
Expr::Binary(
BinOp::Minus,
Box::new(Expr::LNum(-99.0)),
Box::new(Expr::Receive(Box::new(Expr::Binary(
BinOp::Plus,
Box::new(Expr::Var("chan".to_string())),
Box::new(Expr::Call(
"funkyFun".to_string(),
vec![
Expr::Var("a".to_string()),
Expr::LBool(false),
Expr::LStr("hey".to_string())
]
))
))))
)
);
assert_eq!(rest, "");
}
} }