From 49716a8192ca05125fd9160380a2ebab792b56af Mon Sep 17 00:00:00 2001 From: Natapat Samutpong Date: Sat, 12 Feb 2022 20:21:42 +0700 Subject: [PATCH] infix expr --- example/hello_world.hyc | 3 +++ src/front/parser.rs | 23 +++++++++++++++++++---- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/example/hello_world.hyc b/example/hello_world.hyc index 68f9bad..d907ef2 100644 --- a/example/hello_world.hyc +++ b/example/hello_world.hyc @@ -7,4 +7,7 @@ func foo :: (a, b) = { func main :: () = { // if else in variable definition let cond_str :: String = if true { return "t" } else { return "f" }; + + // Infix operator + let n :: Bool = 2 == 2; }; diff --git a/src/front/parser.rs b/src/front/parser.rs index 2695cde..7c29f9a 100644 --- a/src/front/parser.rs +++ b/src/front/parser.rs @@ -6,7 +6,7 @@ use nom::{ error::{Error, ErrorKind}, IResult, multi::many0, - sequence::{terminated, tuple, pair, preceded, delimited}, + sequence::{terminated, tuple, pair, preceded, delimited}, error_position, }; use super::model::{Token, Tokens, Precedence, Infix, Program, Stmt, Expr, Ident, Literal}; @@ -112,6 +112,22 @@ fn parse_call_expr(input: Tokens, func_handle: Expr) -> IResult { )(input) } +fn parse_infix_expr(input: Tokens, left: Expr) -> IResult { + let (i1, t1) = take(1usize)(input)?; + if t1.tokens.is_empty() { Err(Err::Error(error_position!(input, ErrorKind::Tag))) } + else { + let next = &t1.tokens[0]; + let (prec, op) = infix_operator(next); + match op { + None => Err(Err::Error(error_position!(input, ErrorKind::Tag))), + Some(op) => { + let (i2, right) = parse_expr_with(i1, prec)?; + Ok((i2, Expr::Infix(op, Box::new(left), Box::new(right)))) + } + } + } +} + fn parse_expr(input: Tokens, precedence: Precedence, left: Expr) -> IResult { let (i1, t1) = take(1usize)(input)?; @@ -124,9 +140,8 @@ fn parse_expr(input: Tokens, precedence: Precedence, left: Expr) -> IResult { - // let (i2, left2) = parse_infix_expr(input, left)?; - // parse_expr(i2, precedence, left2) - todo!() + let (i2, left2) = parse_infix_expr(input, left)?; + parse_expr(i2, precedence, left2) }, _ => Ok((input, left)), }