diff --git a/source/md.h b/source/md.h index e59f847..3f56752 100644 --- a/source/md.h +++ b/source/md.h @@ -5,8 +5,8 @@ // // [x] unify string literal token kinds // [x] simplify string literal flags (triple as a single flag) -// [ ] lexer detects broken comments -// [ ] lexer detects broken strings +// [x] lexer detects broken comments +// [x] lexer detects broken strings // [x] tests for legal tag syntaxes // [x] tests that ensure we don't accept labels when expecting symbols e.g. foo ":" b; foo: "(" ) // [ ] pass all tests diff --git a/source/md_impl.c b/source/md_impl.c index 722e69e..0294121 100644 --- a/source/md_impl.c +++ b/source/md_impl.c @@ -1169,10 +1169,6 @@ MD_TokenFromString(MD_String8 string) token.kind = MD_TokenKind_Comment; chop_n = 2; } - else - { - // TODO(allen): emit an error *from here* - } } } if (token.kind == 0) goto symbol_lex; @@ -1845,17 +1841,36 @@ MD_ParseOneNode(MD_String8 string, MD_u64 offset) { off += bad_token.outer_string.size; - // TODO(allen): tighten up with good integer <-> string helpers - MD_String8List bytes = {0}; - for(int i_byte = 0; i_byte < bad_token.outer_string.size; ++i_byte) - { - MD_PushStringToList(&bytes, MD_PushStringF("0x%02X", bad_token.outer_string.str[i_byte])); + switch (bad_token.kind){ + case MD_TokenKind_BadCharacter: + { + // TODO(allen): tighten up with good integer <-> string helpers + MD_String8List bytes = {0}; + for(int i_byte = 0; i_byte < bad_token.outer_string.size; ++i_byte) + { + MD_PushStringToList(&bytes, MD_PushStringF("0x%02X", bad_token.outer_string.str[i_byte])); + } + MD_String8 byte_string = MD_JoinStringList(bytes, MD_S8Lit(" ")); + + MD_Error *error = MD_MakeTokenError(string, bad_token, MD_MessageKind_Error, + MD_PushStringF("Non-ASCII character \"%.*s\"", MD_StringExpand(byte_string))); + MD_PushErrorToList(&result.errors, error); + }break; + + case MD_TokenKind_BrokenComment: + { + MD_Error *error = MD_MakeTokenError(string, bad_token, MD_MessageKind_Error, + MD_S8Lit("Unterminated comment")); + MD_PushErrorToList(&result.errors, error); + }break; + + case MD_TokenKind_BrokenStringLiteral: + { + MD_Error *error = MD_MakeTokenError(string, bad_token, MD_MessageKind_Error, + MD_S8Lit("Unterminated string literal")); + MD_PushErrorToList(&result.errors, error); + }break; } - MD_String8 byte_string = MD_JoinStringList(bytes, MD_S8Lit(" ")); - - MD_Error *error = MD_MakeTokenError(string, bad_token, MD_MessageKind_Error, - MD_PushStringF("Non-ASCII character \"%.*s\"", MD_StringExpand(byte_string))); - MD_PushErrorToList(&result.errors, error); goto retry; } }