diff options
| author | Bruce Hill <bruce@bruce-hill.com> | 2024-07-04 18:45:04 -0400 |
|---|---|---|
| committer | Bruce Hill <bruce@bruce-hill.com> | 2024-07-04 18:45:04 -0400 |
| commit | 4d3ea3f73e5f040c1de020d0075a87c006c2ad67 (patch) | |
| tree | 5ff8815de9360cd91cb0b59d0ceadcba9e98303e | |
| parent | f4dee58f03774d033c55d890356cd93c3e2462fb (diff) | |
Check for newline between statements in blocks
| -rw-r--r-- | ast.c | 2 | ||||
| -rw-r--r-- | parse.c | 11 |
2 files changed, 11 insertions, 2 deletions
@@ -97,7 +97,7 @@ CORD ast_to_xml(ast_t *ast) T(Unknown, "<Unknown>") T(Nil, "<Nil>%r</Nil>", type_ast_to_xml(data.type)) T(Bool, "<Bool value=\"%s\" />", data.b ? "yes" : "no") - T(Var, "%s", data.name) + T(Var, "<Var>%s</Var>", data.name) T(Int, "<Int bits=\"%ld\">%ld</Int>", data.bits, data.i) T(Num, "<Num bits=\"%ld\">%g</Num>", data.bits, data.n) T(TextLiteral, "%r", xml_escape(data.cord)) @@ -1619,7 +1619,16 @@ PARSER(parse_block) { break; } statements = new(ast_list_t, .ast=stmt, .next=statements); - whitespace(&pos); // TODO: check for newline + whitespace(&pos); + + // Guard against having two valid statements on the same line, separated by spaces (but no newlines): + if (!memchr(stmt->end, '\n', (size_t)(pos - stmt->end))) { + if (*pos) + parser_err(ctx, pos, strchrnul(pos, '\n'), "I don't know how to parse the rest of this line"); + pos = stmt->end; + break; + } + if (get_indent(ctx, pos) != block_indent) { pos = stmt->end; // backtrack break; |
