detect broken strings in the lexer

This commit is contained in:
Allen Webster
2021-06-30 15:46:39 -04:00
parent 174e995e00
commit 1454f04265
2 changed files with 7 additions and 16 deletions
+4 -4
View File
@@ -427,9 +427,9 @@ enum
MD_TokenKind_Comment = (1<<5), MD_TokenKind_Comment = (1<<5),
MD_TokenKind_Whitespace = (1<<6), MD_TokenKind_Whitespace = (1<<6),
MD_TokenKind_Newline = (1<<7), MD_TokenKind_Newline = (1<<7),
MD_TokenKind_BrokenComment = (1<<8), MD_TokenKind_BrokenComment = (1<<8),
MD_TokenKind_BrokenString = (1<<9), MD_TokenKind_BrokenStringLiteral = (1<<9),
MD_TokenKind_BadCharacter = (1<<10), MD_TokenKind_BadCharacter = (1<<10),
}; };
enum enum
@@ -445,7 +445,7 @@ enum
MD_TokenKind_StringLiteral| MD_TokenKind_StringLiteral|
MD_TokenKind_Symbol), MD_TokenKind_Symbol),
MD_TokenGroup_Error = (MD_TokenKind_BrokenComment| MD_TokenGroup_Error = (MD_TokenKind_BrokenComment|
MD_TokenKind_BrokenString| MD_TokenKind_BrokenStringLiteral|
MD_TokenKind_BadCharacter), MD_TokenKind_BadCharacter),
}; };
+3 -12
View File
@@ -1183,10 +1183,7 @@ MD_TokenFromString(MD_String8 string)
case '\'': case '\'':
case '`': case '`':
{ {
token.kind = MD_TokenKind_StringLiteral; token.kind = MD_TokenKind_BrokenStringLiteral;
// TODO(allen): proposal:
// go see the proposal in the block comment lexer, same idea here?
// determine delimiter setup // determine delimiter setup
MD_u8 d = *at; MD_u8 d = *at;
@@ -1212,6 +1209,7 @@ MD_TokenFromString(MD_String8 string)
// close condition // close condition
if (consecutive_d == 3){ if (consecutive_d == 3){
chop_n = 3; chop_n = 3;
token.kind = MD_TokenKind_StringLiteral;
break; break;
} }
} }
@@ -1246,6 +1244,7 @@ MD_TokenFromString(MD_String8 string)
if (*at == d){ if (*at == d){
at += 1; at += 1;
chop_n = 1; chop_n = 1;
token.kind = MD_TokenKind_StringLiteral;
break; break;
} }
@@ -1775,16 +1774,8 @@ MD_ParseOneNode(MD_String8 string, MD_u64 offset)
label_name.outer_string.str - string.str); label_name.outer_string.str - string.str);
parsed_node->flags |= label_name.node_flags; parsed_node->flags |= label_name.node_flags;
//- rjf: check for string literal errors
if(label_name.kind == MD_TokenKind_StringLiteral) if(label_name.kind == MD_TokenKind_StringLiteral)
{ {
if(!_MD_TokenBoundariesAreBalanced(label_name))
{
MD_String8 capped = MD_StringPrefix(label_name.outer_string, MD_UNTERMINATED_TOKEN_LEN_CAP);
MD_Error *error = MD_MakeNodeError(parsed_node, MD_MessageKind_CatastrophicError,
MD_PushStringF("Unterminated text literal \"%.*s\"", MD_StringExpand(capped)));
MD_PushErrorToList(&result.errors, error);
}
} }
//- rjf: check for unexpected reserved symbols //- rjf: check for unexpected reserved symbols