Start avoiding parse diagnostics on error tokens (#4431)

An invalid parse due to an error token isn't likely a great diagnostic
as it will already have been diagnosed by the lexer. A common case to
start handling that is when the parser encounters an invalid token when
expecting an expression.

This removes a number of unhelpful diagnostics after the lexer has done
a good job diagnosing.

This also means that there may be parse tree errors that aren't
diagnosed when there are lexer-diagnosed errors, so track that.

Follow-up to #4430 that almost finishes addressing its diagnostic TODO.
This commit is contained in:
Chandler Carruth
2024-11-02 05:53:27 +00:00
committed by GitHub
parent 44fe65fbe5
commit 1b2eb42c5a
5 changed files with 15 additions and 32 deletions
+7 -3
View File
@@ -73,7 +73,7 @@ auto HandleExprInPostfix(Context& context) -> void {
// Parses a primary expression, which is either a terminal portion of an
// expression tree, such as an identifier or literal, or a parenthesized
// expression.
switch (context.PositionKind()) {
switch (auto token_kind = context.PositionKind()) {
case Lex::TokenKind::Identifier: {
context.AddLeafNode(NodeKind::IdentifierNameExpr, context.Consume());
context.PushState(state);
@@ -208,11 +208,15 @@ auto HandleExprInPostfix(Context& context) -> void {
break;
}
default: {
// If not already diagnosed in the lexer, diagnose it here.
if (token_kind != Lex::TokenKind::Error) {
CARBON_DIAGNOSTIC(ExpectedExpr, Error, "expected expression");
context.emitter().Emit(*context.position(), ExpectedExpr);
}
// Add a node to keep the parse tree balanced.
context.AddLeafNode(NodeKind::InvalidParse, *context.position(),
/*has_error=*/true);
CARBON_DIAGNOSTIC(ExpectedExpr, Error, "expected expression");
context.emitter().Emit(*context.position(), ExpectedExpr);
context.ReturnErrorOnState();
break;
}