From b7380360cddd1bd043e9472c8d9634773b125015 Mon Sep 17 00:00:00 2001 From: niuez Date: Sat, 22 Jan 2022 22:08:05 +0900 Subject: [PATCH] [fix] empty struct instantiation syntax --- src/expression/if_expr.rs | 4 ++-- src/structs/struct_instantiation.rs | 6 +++++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/expression/if_expr.rs b/src/expression/if_expr.rs index 14580e2..f3f93ee 100644 --- a/src/expression/if_expr.rs +++ b/src/expression/if_expr.rs @@ -121,7 +121,6 @@ impl MoveCheck for IfExpr { } } - pub fn parse_if_expr(s: ContentStr<'_>) -> IResult, Expression> { let (s, (_, _, if_cond, _, if_block, _, many, el_block, _)) = tuple((tag("if"), multispace1, parse_expression, multispace0, parse_block, multispace0, many0(tuple((tag("else"), multispace1, tag("if"), multispace1, parse_expression, multispace0, parse_block, multispace0))), @@ -134,5 +133,6 @@ pub fn parse_if_expr(s: ContentStr<'_>) -> IResult, Expression> { #[test] fn parse_if_expr_test() { - println!("{:?}", parse_if_expr("if a == b { c } else { d }".into_content(0)).ok()); + println!("{:?}", parse_if_expr("if a == b { c } else { d }".into_content(0)).unwrap()); + println!("{:?}", parse_if_expr("if a == b {} else { let a = 0; }".into_content(0)).unwrap()); } diff --git a/src/structs/struct_instantiation.rs b/src/structs/struct_instantiation.rs index 1f8b1e7..5511d01 100644 --- a/src/structs/struct_instantiation.rs +++ b/src/structs/struct_instantiation.rs @@ -4,6 +4,7 @@ use nom::IResult; use nom::character::complete::*; use nom::multi::*; use nom::sequence::*; +use nom::branch::*; use nom::combinator::*; use crate::identifier::{ Identifier, parse_identifier, Tag }; @@ -53,7 +54,10 @@ fn parse_member(s: ContentStr<'_>) -> IResult, (Identifier, (Expr pub fn parse_struct_instantiation(s: ContentStr<'_>) -> IResult, UnaryExpr> { let (s, ((struct_id, _, _, _, opts, _), range)) = with_range(tuple((parse_type_id, multispace0, char('{'), multispace0, - opt(tuple((parse_member, many0(tuple((multispace0, char(','), multispace0, parse_member))), opt(tuple((multispace0, char(',')))), multispace0))), + alt(( + map(tuple((parse_member, many0(tuple((multispace0, char(','), multispace0, parse_member))), opt(tuple((multispace0, char(',')))), multispace0)), |p| Some(p)), + map(tuple((char(','), multispace0)), |_| None) + )), char('}'))))(s)?; let members = match opts { None => HashMap::new(),