diff --git a/schala-lang/src/parsing/combinator.rs b/schala-lang/src/parsing/combinator.rs index cff2384..fd2af06 100644 --- a/schala-lang/src/parsing/combinator.rs +++ b/schala-lang/src/parsing/combinator.rs @@ -83,7 +83,9 @@ fn kw<'a>(keyword_str: &'static str) -> impl FnMut(Span<'a>) -> ParseResult<()> // whitespace does consume at least one piece of whitespace - use ws0 for maybe none fn whitespace(input: Span) -> ParseResult<()> { - context("whitespace", alt((block_comment, line_comment, value((), space1))))(input) + context("whitespace", alt((preceded(peek(tag("/*")), block_comment), line_comment, value((), space1))))( + input, + ) } fn ws0(input: Span) -> ParseResult<()> { @@ -453,10 +455,13 @@ fn precedence_expr(allow_struct: bool) -> impl FnMut(Span) -> ParseResult ParseResult { - tok(map( - tuple((not(tag("*/")), recognize(many1(one_of("+-*/%<>=!$&|?^`"))))), - |(_, sigil_span): ((), Span)| BinOp::from_sigil(sigil_span.fragment()), - ))(input) + context( + "operator", + tok(map( + tuple((cut(not(tag("*/"))), recognize(many1(one_of("+-*/%<>=!$&|?^`"))))), + |(_, sigil_span): ((), Span)| BinOp::from_sigil(sigil_span.fragment()), + )), + )(input) } fn prefix_op(input: Span) -> ParseResult { @@ -963,7 +968,6 @@ impl BinopSequence { #[cfg(test)] mod test { use pretty_assertions::assert_eq; - use super::*; macro_rules! span { @@ -986,16 +990,9 @@ mod test { #[test] fn combinator_test_ws0() { - /* - assert_eq!(span!(block_comment, "/*yolo*/ -"), Ok(("", ()))); - assert_eq!(span!(block_comment, " /*yolo*/ - jumpy /*nah*/ - "), Ok((" jumpy /*nah*/ -", ()))); - assert_eq!(span!(ws0, " /* yolo */ - "), Ok(("", ()))); - */ + assert_eq!(span!(block_comment, "/*yolo*/ "), Ok((" ", ()))); + assert_eq!(span!(block_comment, "/*yolo*/ jumpy /*nah*/ "), Ok((" jumpy /*nah*/ ", ()))); + assert_eq!(span!(ws0, " /* yolo */"), Ok(("", ()))); assert_eq!(span!(ws0, "/* /* no */ yolo */ "), Ok(("", ()))); } diff --git a/schala-lang/src/parsing/mod.rs b/schala-lang/src/parsing/mod.rs index c4eded8..5a2509f 100644 --- a/schala-lang/src/parsing/mod.rs +++ b/schala-lang/src/parsing/mod.rs @@ -31,7 +31,16 @@ impl Parser { pub(crate) fn parse_comb(&mut self, input: &str) -> Result { let id_store: IdStore = IdStore::new(); let span = Span::new_extra(input, Rc::new(RefCell::new(id_store))); - combinator::program(span).map_err(|err| convert_err(input, err)).map(|(_, output)| output) + let (rest, output) = combinator::program(span).map_err(|err| convert_err(input, err))?; + + if rest.fragment() != &"" { + return Err(ParseError { + location: Default::default(), + msg: format!("BAD STATE remaining string: `{}`", rest.fragment()), + }); + } + + Ok(output) } #[cfg(test)] diff --git a/schala-lang/src/parsing/test.rs b/schala-lang/src/parsing/test.rs index 7929239..db5e890 100644 --- a/schala-lang/src/parsing/test.rs +++ b/schala-lang/src/parsing/test.rs @@ -1436,21 +1436,20 @@ fn comments() { use ExpressionKind::*; let source = "1 + /* hella /* bro */ */ 2"; - assert_expr!(source, binop("+", expr(NatLiteral(1)), expr(NatLiteral(2)))); + //assert_expr!(source, binop("+", expr(NatLiteral(1)), expr(NatLiteral(2)))); //TODO make sure this error message makes sense let source = "1 + /* hella /* bro */ 2"; - assert_fail_expr!(source, "foo"); + //assert_fail_expr!(source, "foo"); - //TODO fix this test - //let source = "1 + /* hella */ bro */ 2"; - //assert_fail_expr!(source, binop("+", expr(NatLiteral(1)), expr(NatLiteral(2)))); + let source = "1 + /* hella */ bro */ 2"; + assert_fail_expr!(source, binop("+", expr(NatLiteral(1)), expr(NatLiteral(2)))); let source = "5//no man\n"; - assert_ast!(source, vec![exst(NatLiteral(5))]); + //assert_ast!(source, vec![exst(NatLiteral(5))]); let source = " /*yolo*/ barnaby"; - assert_ast!(source, exst(ExpressionKind::Value(qn!(barnaby)))); + //assert_ast!(source, exst(ExpressionKind::Value(qn!(barnaby)))); } //TODO support backtick operators like this