let parse_expr (s : string) : Ast.expr = let lexbuf = Lexing.from_string s in let string_source : Asai.Range.string_source = { title = None; content = s; } in let source = `String string_source in Eff.run ~env:source @@ fun () -> try Grammar.start_expr Lexer.token lexbuf with | Lexer.IllegalCharacter illegal_char -> Reporter.illegal_character ~loc:(Asai.Range.of_lexbuf ~source lexbuf) illegal_char | Grammar.Error -> Reporter.syntax_error ~loc:(Asai.Range.of_lexbuf ~source lexbuf)