diff --git a/src/main/java/com/google/devtools/build/lib/syntax/Parser.java b/src/main/java/com/google/devtools/build/lib/syntax/Parser.java
index 187f11b..3ce949d 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/Parser.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/Parser.java
@@ -240,11 +240,11 @@
     }
   }
 
-  private void syntaxError(Token token) {
+  private void syntaxError(Token token, String message) {
     if (!recoveryMode) {
       String msg = token.kind == TokenKind.INDENT
           ? "indentation error"
-          : "syntax error at '" + token + "'";
+          : "syntax error at '" + token + "': " + message;
       reportError(lexer.createLocation(token.left, token.right), msg);
       recoveryMode = true;
     }
@@ -255,7 +255,7 @@
   private boolean expect(TokenKind kind) {
     boolean expected = token.kind == kind;
     if (!expected) {
-      syntaxError(token);
+      syntaxError(token, "expected " + kind.getPrettyName());
     }
     nextToken();
     return expected;
@@ -454,7 +454,7 @@
         return setLocation(new DotExpression(receiver, ident), start, token.right);
       }
     } else {
-      syntaxError(token);
+      syntaxError(token, "expected identifier after dot");
       int end = syncTo(EXPR_TERMINATOR_SET);
       return makeErrorExpression(start, end);
     }
@@ -632,7 +632,7 @@
           nextToken();
           return expression;
         }
-        syntaxError(token);
+        expect(TokenKind.RPAREN);
         int end = syncTo(EXPR_TERMINATOR_SET);
         return makeErrorExpression(start, end);
       }
@@ -646,7 +646,7 @@
                                      start, token.right);
       }
       default: {
-        syntaxError(token);
+        syntaxError(token, "expected expression");
         int end = syncTo(EXPR_TERMINATOR_SET);
         return makeErrorExpression(start, end);
       }
@@ -772,7 +772,7 @@
           }
         } while (token.kind == TokenKind.FOR);
 
-        syntaxError(token);
+        syntaxError(token, "expected 'for' or ']'");
         int end = syncPast(LIST_TERMINATOR_SET);
         return makeErrorExpression(start, end);
       }
@@ -787,12 +787,12 @@
           nextToken();
           return literal;
         }
-        syntaxError(token);
+        expect(TokenKind.RBRACKET);
         int end = syncPast(LIST_TERMINATOR_SET);
         return makeErrorExpression(start, end);
       }
       default: {
-        syntaxError(token);
+        syntaxError(token, "expected ',', 'for' or ']'");
         int end = syncPast(LIST_TERMINATOR_SET);
         return makeErrorExpression(start, end);
       }
@@ -834,14 +834,14 @@
       nextToken();
       return literal;
     }
-    syntaxError(token);
+    expect(TokenKind.RBRACE);
     int end = syncPast(DICT_TERMINATOR_SET);
     return makeErrorExpression(start, end);
   }
 
   private Ident parseIdent() {
     if (token.kind != TokenKind.IDENTIFIER) {
-      syntaxError(token);
+      expect(TokenKind.IDENTIFIER);
       return makeErrorExpression(token.left, token.right);
     }
     Ident ident = new Ident(((String) token.value));
