diff --git a/tools/spec_parse.py b/tools/spec_parse.py
index 79ba306..ba87ff8 100755
--- a/tools/spec_parse.py
+++ b/tools/spec_parse.py
@@ -4,14 +4,14 @@
 # for details. All rights reserved. Use of this source code is governed by a
 # BSD-style license that can be found in the LICENSE file.
 
-# This script runs the parser which is generated using ANTLR 3 from
+# This script runs the parser which is generated using ANTLR 4 from
 # docs/language/Dart.g. It relies on a certain environment and is hence
 # usable locally where this environment can be obtained, but it may not be
 # possible to run it, e.g., on build bots. The requirements are as follows:
 #
 #   - `make parser` in spec_parser has been executed successfully.
 #   - A suitable JVM is in the PATH and may be executed as 'java'.
-#   - the ANTLR3 jar is available as /usr/share/java/antlr3-runtime.jar.
+#   - the ANTLR3 jar is available as /usr/share/java/antlr4-runtime.jar.
 
 import os
 import string
@@ -32,7 +32,7 @@
   tools_dir = os.path.dirname(os.path.realpath(__file__))
   spec_parser_dir = os.path.join(tools_dir, 'spec_parser')
   spec_parser_file = os.path.join(spec_parser_dir, 'SpecParser.class')
-  antlr_jar = '/usr/share/java/antlr3-runtime.jar'
+  antlr_jar = '/usr/share/java/antlr4-runtime.jar'
   class_path = string.join([spec_parser_dir, antlr_jar], ':')
   command = ['java', '-cp', class_path, 'SpecParser'] + args
 
diff --git a/tools/spec_parser/.gitignore b/tools/spec_parser/.gitignore
index 5810652..8f983c7 100644
--- a/tools/spec_parser/.gitignore
+++ b/tools/spec_parser/.gitignore
@@ -1,5 +1,6 @@
 *Lexer.java
 *Parser.java
+*Listener.java
 *.tokens
 *.class
 *.dot
diff --git a/docs/language/Dart.g b/tools/spec_parser/Dart.g
similarity index 77%
rename from docs/language/Dart.g
rename to tools/spec_parser/Dart.g
index f586c96..099964f 100644
--- a/docs/language/Dart.g
+++ b/tools/spec_parser/Dart.g
@@ -43,29 +43,6 @@
     return !errorHasOccurred;
   }
 
-  /// Produce grammar debugging friendly output, as described in 'The
-  /// Definitive ANTLR Reference', p247.
-  public String getErrorMessage(RecognitionException e, String[] tokenNames) {
-    List stack = getRuleInvocationStack(e, this.getClass().getName());
-    String msg = null;
-    if (e instanceof NoViableAltException) {
-      NoViableAltException nvae = (NoViableAltException)e;
-      msg = "no viable alt; token=" + e.token +
-          " (decision=" + nvae.decisionNumber +
-          " state " + nvae.stateNumber + ")" +
-          " decision=<<" + nvae.grammarDecisionDescription + ">>";
-    }
-    else {
-      msg = super.getErrorMessage(e, tokenNames);
-    }
-    if (!errorHasOccurred) prepareForErrors();
-    return stack + " " + msg;
-  }
-
-  public String getTokenErrorDisplay(Token t) {
-    return t.toString();
-  }
-
   // Enable the parser to treat ASYNC/AWAIT/YIELD as keywords in the body of an
   // `async`, `async*`, or `sync*` function. Access via methods below.
   private Stack<Boolean> asyncEtcAreKeywords = new Stack<Boolean>();
@@ -89,20 +66,6 @@
     }
     return false;
   }
-
-  // Debugging support methods.
-  void dp(int indent, String method, String sep) {
-    for (int i = 0; i < indent; i++) {
-      System.out.print("  ");
-    }
-    System.out.println(method + sep + " " + input.LT(1) + " " + state.failed);
-  }
-
-  void dpBegin(int indent, String method) { dp(indent, method, ":"); }
-  void dpEnd(int indent, String method) { dp(indent, method, " END:"); }
-  void dpCall(int indent, String method) { dp(indent, method, "?"); }
-  void dpCalled(int indent, String method) { dp(indent, method, ".."); }
-  void dpResult(int indent, String method) { dp(indent, method, "!"); }
 }
 
 @lexer::members{
@@ -112,13 +75,6 @@
   public static final int BRACE_THREE_SINGLE = 4;
   public static final int BRACE_THREE_DOUBLE = 5;
 
-  /// This override ensures that lexer errors are recognized as errors,
-  /// but does not change the format of the reported error.
-  public String getErrorMessage(RecognitionException e, String[] tokenNames) {
-    if (!DartParser.errorHasOccurred) DartParser.prepareForErrors();
-    return super.getErrorMessage(e, tokenNames);
-  }
-
   // Enable the parser to handle string interpolations via brace matching.
   // The top of the `braceLevels` stack describes the most recent unmatched
   // '{'. This is needed in order to enable/disable certain lexer rules.
@@ -171,9 +127,9 @@
 
 libraryDefinition
     :    FEFF? SCRIPT_TAG?
-         ((metadata LIBRARY) => libraryName)?
-         ((metadata (IMPORT | EXPORT)) => importOrExport)*
-         ((metadata PART) => partDirective)*
+         libraryName?
+         importOrExport*
+         partDirective*
          (metadata topLevelDefinition)*
          EOF
     ;
@@ -181,16 +137,13 @@
 topLevelDefinition
     :    classDefinition
     |    enumType
-    |    (TYPEDEF typeIdentifier typeParameters? '=') => typeAlias
-    |    (TYPEDEF functionPrefix ('<' | '(')) => typeAlias
-    |    (EXTERNAL functionSignature ';') => EXTERNAL functionSignature ';'
-    |    (EXTERNAL getterSignature) => EXTERNAL getterSignature ';'
-    |    (EXTERNAL type? SET identifier '(') =>
-         EXTERNAL setterSignature ';'
-    |    (getterSignature functionBodyPrefix) => getterSignature functionBody
-    |    (type? SET identifier '(') => setterSignature functionBody
-    |    (type? identifierNotFUNCTION typeParameters? '(') =>
-         functionSignature functionBody
+    |    typeAlias
+    |    EXTERNAL functionSignature ';'
+    |    EXTERNAL getterSignature ';'
+    |    EXTERNAL setterSignature ';'
+    |    getterSignature functionBody
+    |    setterSignature functionBody
+    |    functionSignature functionBody
     |    (FINAL | CONST) type? staticFinalDeclarationList ';'
     |    topLevelVariableDeclaration ';'
     ;
@@ -276,9 +229,8 @@
     ;
 
 normalFormalParameterNoMetadata
-    :    (COVARIANT? type? identifierNotFUNCTION formalParameterPart) =>
-         functionFormalParameter
-    |    (finalConstVarOrType? THIS) => fieldFormalParameter
+    :    functionFormalParameter
+    |    fieldFormalParameter
     |    simpleFormalParameter
     ;
 
@@ -310,11 +262,9 @@
     ;
 
 classDefinition
-    :    (ABSTRACT? CLASS typeApplication (EXTENDS|IMPLEMENTS|LBRACE)) =>
-         ABSTRACT? CLASS typeApplication (superclass mixins?)? interfaces?
+    :    ABSTRACT? CLASS typeApplication (superclass mixins?)? interfaces?
          LBRACE (metadata classMemberDefinition)* RBRACE
-    |    (ABSTRACT? CLASS typeApplication '=') =>
-         ABSTRACT? CLASS mixinApplicationClass
+    |    ABSTRACT? CLASS mixinApplicationClass
     ;
 
 mixins
@@ -322,18 +272,17 @@
     ;
 
 classMemberDefinition
-    :    (methodSignature functionBodyPrefix) => methodSignature functionBody
+    :    methodSignature functionBody
     |    declaration ';'
     ;
 
 methodSignature
-    :    (constructorSignature ':') => constructorSignature initializers
-    |    (FACTORY constructorName '(') => factoryConstructorSignature
-    |    (STATIC? type? identifierNotFUNCTION typeParameters? '(') =>
-         STATIC? functionSignature
-    |    (STATIC? type? GET) => STATIC? getterSignature
-    |    (STATIC? type? SET) => STATIC? setterSignature
-    |    (type? OPERATOR operator '(') => operatorSignature
+    :    constructorSignature initializers
+    |    factoryConstructorSignature
+    |    STATIC? functionSignature
+    |    STATIC? getterSignature
+    |    STATIC? setterSignature
+    |    operatorSignature
     |    constructorSignature
     ;
 
@@ -355,25 +304,17 @@
 // check.
 
 declaration
-    :    (EXTERNAL CONST? FACTORY constructorName '(') =>
-         EXTERNAL factoryConstructorSignature
-    |    (EXTERNAL CONST constructorName '(') =>
-         EXTERNAL constantConstructorSignature
-    |    (EXTERNAL constructorName '(') => EXTERNAL constructorSignature
-    |    ((EXTERNAL STATIC?)? type? GET identifier) =>
-         (EXTERNAL STATIC?)? getterSignature
-    |    ((EXTERNAL STATIC?)? type? SET identifier) =>
-         (EXTERNAL STATIC?)? setterSignature
-    |    (EXTERNAL? type? OPERATOR) => EXTERNAL? operatorSignature
-    |    (STATIC (FINAL | CONST)) =>
-         STATIC (FINAL | CONST) type? staticFinalDeclarationList
+    :    EXTERNAL factoryConstructorSignature
+    |    EXTERNAL constantConstructorSignature
+    |    EXTERNAL constructorSignature
+    |    (EXTERNAL STATIC?)? getterSignature
+    |    (EXTERNAL STATIC?)? setterSignature
+    |    EXTERNAL? operatorSignature
+    |    STATIC (FINAL | CONST) type? staticFinalDeclarationList
     |    FINAL type? initializedIdentifierList
-    |    ((STATIC | COVARIANT)? (VAR | type) identifier ('=' | ',' | ';')) =>
-         (STATIC | COVARIANT)? (VAR | type) initializedIdentifierList
-    |    (EXTERNAL? STATIC? functionSignature ';') =>
-         EXTERNAL? STATIC? functionSignature
-    |    (CONST? FACTORY constructorName formalParameterList '=') =>
-         redirectingFactoryConstructorSignature
+    |    (STATIC | COVARIANT)? (VAR | type) initializedIdentifierList
+    |    EXTERNAL? STATIC? functionSignature
+    |    redirectingFactoryConstructorSignature
     |    constantConstructorSignature (redirection | initializers)?
     |    constructorSignature (redirection | initializers)?
     ;
@@ -400,7 +341,7 @@
 binaryOperator
     :    multiplicativeOperator
     |    additiveOperator
-    |    (shiftOperator) => shiftOperator
+    |    shiftOperator
     |    relationalOperator
     |    '=='
     |    bitwiseOperator
@@ -496,20 +437,16 @@
     ;
 
 expression
-    :    (formalParameterPart functionExpressionBodyPrefix) =>
-         functionExpression
+    :    functionExpression
     |    throwExpression
-    |    (assignableExpression assignmentOperator) =>
-         assignableExpression assignmentOperator expression
+    |    assignableExpression assignmentOperator expression
     |    conditionalExpression cascadeSection*
     ;
 
 expressionWithoutCascade
-    :    (formalParameterPart functionExpressionBodyPrefix) =>
-         functionExpressionWithoutCascade
+    :    functionExpressionWithoutCascade
     |    throwExpressionWithoutCascade
-    |    (assignableExpression assignmentOperator) =>
-         assignableExpression assignmentOperator expressionWithoutCascade
+    |    assignableExpression assignmentOperator expressionWithoutCascade
     |    conditionalExpression
     ;
 
@@ -520,9 +457,9 @@
 primary
     :    thisExpression
     |    SUPER unconditionalAssignableSelector
-    |    (CONST constructorDesignation) => constObjectExpression
+    |    constObjectExpression
     |    newExpression
-    |    (formalParameterPart functionPrimaryBodyPrefix) => functionPrimary
+    |    functionPrimary
     |    '(' expression ')'
     |    literal
     |    identifier
@@ -534,7 +471,7 @@
     |    numericLiteral
     |    stringLiteral
     |    symbolLiteral
-    |    (CONST? typeArguments? LBRACE) => mapLiteral
+    |    mapLiteral
     |    listLiteral
     ;
 
@@ -770,8 +707,8 @@
     ;
 
 unaryExpression
-    :    (prefixOperator ~SUPER) => prefixOperator unaryExpression
-    |    (awaitExpression) => awaitExpression
+    :    prefixOperator unaryExpression
+    |    awaitExpression
     |    postfixExpression
     |    (minusOperator | tildeOperator) SUPER
     |    incrementOperator assignableExpression
@@ -804,11 +741,9 @@
 // sequence of two relational expressions.
 
 postfixExpression
-    :    (assignableExpression postfixOperator) =>
-         assignableExpression postfixOperator
-    |    (typeName typeArguments '.') =>
-         constructorInvocation ((selector) => selector)*
-    |    primary ((selector) => selector)*
+    :    assignableExpression postfixOperator
+    |    constructorInvocation selector*
+    |    primary selector*
     ;
 
 constructorInvocation
@@ -841,15 +776,10 @@
 // relationalOperator, not the beginning of typeArguments.
 
 assignableExpression
-    :    (SUPER unconditionalAssignableSelector
-            ~('<' | '(' | '[' | '.' | '?.')) =>
-         SUPER unconditionalAssignableSelector
-    |    (typeName typeArguments '.' identifier '(') =>
-         constructorInvocation
-         ((assignableSelectorPart) => assignableSelectorPart)+
-    |    (identifier ~('<' | '(' | '[' | '.' | '?.')) => identifier
-    |    (primary assignableSelectorPart) =>
-         primary ((assignableSelectorPart) => assignableSelectorPart)+
+    :    SUPER unconditionalAssignableSelector
+    |    constructorInvocation assignableSelectorPart+
+    |    identifier
+    |    primary assignableSelectorPart+
     |    identifier
     ;
 
@@ -891,7 +821,7 @@
     |    ON // Not a built-in identifier.
     |    SHOW // Not a built-in identifier.
     |    SYNC // Not a built-in identifier.
-    |    { asyncEtcPredicate(input.LA(1)) }? (ASYNC|AWAIT|YIELD)
+    |    { asyncEtcPredicate(getCurrentToken().getType()) }? (ASYNC|AWAIT|YIELD)
     ;
 
 identifier
@@ -913,7 +843,7 @@
     |    ON // Not a built-in identifier.
     |    SHOW // Not a built-in identifier.
     |    SYNC // Not a built-in identifier.
-    |    { asyncEtcPredicate(input.LA(1)) }? (ASYNC|AWAIT|YIELD)
+    |    { asyncEtcPredicate(getCurrentToken().getType()) }? (ASYNC|AWAIT|YIELD)
     ;
 
 typeTest
@@ -947,10 +877,9 @@
 // add another statement which can start with LBRACE we must adjust this
 // check.
 nonLabelledStatement
-    :    (LBRACE) => block
-    |    (metadata declaredIdentifier ('='|','|';')) =>
-         localVariableDeclaration
-    |    (AWAIT? FOR) => forStatement
+    :    block
+    |    localVariableDeclaration
+    |    forStatement
     |    whileStatement
     |    doStatement
     |    switchStatement
@@ -960,10 +889,9 @@
     |    breakStatement
     |    continueStatement
     |    returnStatement
-    |    (metadata functionSignature functionBodyPrefix) =>
-         localFunctionDeclaration
+    |    localFunctionDeclaration
     |    assertStatement
-    |    (YIELD ~'*') => yieldStatement
+    |    yieldStatement
     |    yieldEachStatement
     |    expressionStatement
     ;
@@ -985,7 +913,7 @@
     ;
 
 ifStatement
-    :    IF '(' expression ')' statement ((ELSE) => ELSE statement | ())
+    :    IF '(' expression ')' statement (ELSE statement | ())
     ;
 
 forStatement
@@ -993,16 +921,15 @@
     ;
 
 forLoopParts
-    :    (metadata declaredIdentifier IN) =>
-         metadata declaredIdentifier IN expression
-    |    (metadata identifier IN) => metadata identifier IN expression
+    :    metadata declaredIdentifier IN expression
+    |    metadata identifier IN expression
     |    forInitializerStatement expression? ';' expressionList?
     ;
 
 // The localVariableDeclaration cannot be CONST, but that can
 // be enforced in a later phase, and the grammar allows it.
 forInitializerStatement
-    :    (localVariableDeclaration) => localVariableDeclaration
+    :    localVariableDeclaration
     |    expression? ';'
     ;
 
@@ -1040,7 +967,7 @@
     ;
 
 onParts
-    :    (onPart (ON|CATCH)) => onPart onParts
+    :    onPart onParts
     |    onPart
     ;
 
@@ -1089,8 +1016,8 @@
     ;
 
 importOrExport
-    :    (metadata IMPORT) => libraryImport
-    |    (metadata EXPORT) => libraryExport
+    :    libraryImport
+    |    libraryExport
     ;
 
 libraryImport
@@ -1132,9 +1059,8 @@
     ;
 
 type
-    :    (FUNCTION ('('|'<')) => functionTypeTails
-    |    (typeNotFunction FUNCTION ('('|'<')) =>
-         typeNotFunction functionTypeTails
+    :    functionTypeTails
+    |    typeNotFunction functionTypeTails
     |    typeNotFunction
     ;
 
@@ -1144,7 +1070,7 @@
     ;
 
 typeNotVoid
-    :    (typeNotFunction? FUNCTION ('('|'<')) => functionType
+    :    functionType
     |    typeNotVoidNotFunction
     ;
 
@@ -1170,8 +1096,7 @@
     ;
 
 typeAlias
-    :    (TYPEDEF typeIdentifier typeParameters? '=') =>
-         TYPEDEF typeIdentifier typeParameters? '=' functionType ';'
+    :    TYPEDEF typeIdentifier typeParameters? '=' functionType ';'
     |    TYPEDEF functionTypeAlias
     ;
 
@@ -1180,7 +1105,7 @@
     ;
 
 functionPrefix
-    :    (type identifier) => type identifier
+    :    type identifier
     |    identifier
     ;
 
@@ -1189,22 +1114,19 @@
     ;
 
 functionTypeTails
-    :    (functionTypeTail FUNCTION ('<'|'(')) =>
-         functionTypeTail functionTypeTails
+    :    functionTypeTail functionTypeTails
     |    functionTypeTail
     ;
 
 functionType
-    :    (FUNCTION ('<'|'(')) => functionTypeTails
+    :    functionTypeTails
     |    typeNotFunction functionTypeTails
     ;
 
 parameterTypeList
-    :    ('(' ')') => '(' ')'
-    |    ('(' normalParameterTypes ',' ('['|'{')) =>
-         '(' normalParameterTypes ',' optionalParameterTypes ')'
-    |    ('(' normalParameterTypes ','? ')') =>
-         '(' normalParameterTypes ','? ')'
+    :    '(' ')'
+    |    '(' normalParameterTypes ',' optionalParameterTypes ')'
+    |    '(' normalParameterTypes ','? ')'
     |    '(' optionalParameterTypes ')'
     ;
 
@@ -1213,7 +1135,7 @@
     ;
 
 normalParameterType
-    :    (typedIdentifier) => typedIdentifier
+    :    typedIdentifier
     |    type
     ;
 
@@ -1239,9 +1161,8 @@
     |    typeName typeArguments ('.' identifier)?
     ;
 
-// Predicate: Force resolution as composite symbolLiteral as far as possible.
 symbolLiteral
-    :    '#' (operator | (identifier (('.' identifier) => '.' identifier)*))
+    :    '#' (operator | (identifier ('.' identifier)*))
     ;
 
 singleLineStringWithoutInterpolation
@@ -1536,7 +1457,7 @@
     ;
 
 NUMBER
-    :    (DIGIT+ '.' DIGIT) => DIGIT+ '.' DIGIT+ EXPONENT?
+    :    DIGIT+ '.' DIGIT+ EXPONENT?
     |    DIGIT+ EXPONENT?
     |    '.' DIGIT+ EXPONENT?
     ;
@@ -1552,8 +1473,8 @@
     ;
 
 RAW_MULTI_LINE_STRING
-    :    'r' '"""' (options {greedy=false;} : .)* '"""'
-    |    'r' '\'\'\'' (options {greedy=false;} : .)* '\'\'\''
+    :    'r' '"""' (.)*? '"""'
+    |    'r' '\'\'\'' (.)*? '\'\'\''
     ;
 
 fragment
@@ -1577,15 +1498,13 @@
     ;
 
 SINGLE_LINE_STRING_SQ_MID_MID
-    :    { currentBraceLevel(BRACE_SINGLE) }? =>
-         ('}' STRING_CONTENT_SQ* '${') =>
+    :    { currentBraceLevel(BRACE_SINGLE) }?
          { exitBrace(); } '}' STRING_CONTENT_SQ* '${'
          { enterBraceSingleQuote(); }
     ;
 
 SINGLE_LINE_STRING_SQ_MID_END
-    :    { currentBraceLevel(BRACE_SINGLE) }? =>
-         ('}' STRING_CONTENT_SQ* '\'') =>
+    :    { currentBraceLevel(BRACE_SINGLE) }?
          { exitBrace(); } '}' STRING_CONTENT_SQ* '\''
     ;
 
@@ -1605,15 +1524,13 @@
     ;
 
 SINGLE_LINE_STRING_DQ_MID_MID
-    :    { currentBraceLevel(BRACE_DOUBLE) }? =>
-         ('}' STRING_CONTENT_DQ* '${') =>
+    :    { currentBraceLevel(BRACE_DOUBLE) }?
          { exitBrace(); } '}' STRING_CONTENT_DQ* '${'
          { enterBraceDoubleQuote(); }
     ;
 
 SINGLE_LINE_STRING_DQ_MID_END
-    :    { currentBraceLevel(BRACE_DOUBLE) }? =>
-         ('}' STRING_CONTENT_DQ* '"') =>
+    :    { currentBraceLevel(BRACE_DOUBLE) }?
          { exitBrace(); } '}' STRING_CONTENT_DQ* '"'
     ;
 
@@ -1644,15 +1561,13 @@
     ;
 
 MULTI_LINE_STRING_SQ_MID_MID
-    :    { currentBraceLevel(BRACE_THREE_SINGLE) }? =>
-         ('}' STRING_CONTENT_TSQ* QUOTES_SQ '${') =>
+    :    { currentBraceLevel(BRACE_THREE_SINGLE) }?
          { exitBrace(); } '}' STRING_CONTENT_TSQ* QUOTES_SQ '${'
          { enterBraceThreeSingleQuotes(); }
     ;
 
 MULTI_LINE_STRING_SQ_MID_END
-    :    { currentBraceLevel(BRACE_THREE_SINGLE) }? =>
-         ('}' STRING_CONTENT_TSQ* '\'\'\'') =>
+    :    { currentBraceLevel(BRACE_THREE_SINGLE) }?
          { exitBrace(); } '}' STRING_CONTENT_TSQ* '\'\'\''
     ;
 
@@ -1682,15 +1597,13 @@
     ;
 
 MULTI_LINE_STRING_DQ_MID_MID
-    :    { currentBraceLevel(BRACE_THREE_DOUBLE) }? =>
-         ('}' STRING_CONTENT_TDQ* QUOTES_DQ '${') =>
+    :    { currentBraceLevel(BRACE_THREE_DOUBLE) }?
          { exitBrace(); } '}' STRING_CONTENT_TDQ* QUOTES_DQ '${'
          { enterBraceThreeDoubleQuotes(); }
     ;
 
 MULTI_LINE_STRING_DQ_MID_END
-    :    { currentBraceLevel(BRACE_THREE_DOUBLE) }? =>
-         ('}' STRING_CONTENT_TDQ* '"""') =>
+    :    { currentBraceLevel(BRACE_THREE_DOUBLE) }?
          { exitBrace(); } '}' STRING_CONTENT_TDQ* '"""'
     ;
 
@@ -1699,7 +1612,7 @@
     ;
 
 RBRACE
-    :    { currentBraceLevel(BRACE_NORMAL) }? => ('}') => { exitBrace(); } '}'
+    :    { currentBraceLevel(BRACE_NORMAL) }? { exitBrace(); } '}'
     ;
 
 fragment
@@ -1745,7 +1658,7 @@
     ;
 
 MULTI_LINE_COMMENT
-    :    '/*' (options {greedy=false;} : (MULTI_LINE_COMMENT | .))* '*/'
+    :    '/*' (MULTI_LINE_COMMENT | .)*? '*/'
          { skip(); }
     ;
 
diff --git a/tools/spec_parser/Makefile b/tools/spec_parser/Makefile
index f91e7d3..dca1088 100644
--- a/tools/spec_parser/Makefile
+++ b/tools/spec_parser/Makefile
@@ -6,9 +6,9 @@
 JAVA_PATH=/usr/lib/jvm/java-7-openjdk-amd64/bin
 JAVA=$(JAVA_PATH)/java
 JAVAC=javac
-ANTLR_JAR=/usr/share/java/antlr3-runtime.jar
+ANTLR_JAR=/usr/share/java/antlr4-runtime.jar
 ANTLR_FILES=DartLexer.java DartParser.java Dart.tokens
-ANTLR_CMD=PATH=$(JAVA_PATH):$(PATH) antlr3 -dfa -fo . $<
+ANTLR_CMD=PATH=$(JAVA_PATH):$(PATH) antlr4 $<
 JAVA_FILES=DartLexer.java DartParser.java
 CLASS_FILES=SpecParser.class SpecParserRunner.class DartLexer.class DartParser.class
 
@@ -21,11 +21,11 @@
 SpecParser.class: $(ANTLR_FILES) SpecParser.java
 	$(JAVAC) -cp .:$(ANTLR_JAR) SpecParser.java
 
-%Lexer.java: ../../docs/language/%.g Makefile ; $(ANTLR_CMD)
+%Lexer.java: %.g Makefile ; $(ANTLR_CMD)
 
-%Parser.java: ../../docs/language/%.g Makefile ; $(ANTLR_CMD)
+%Parser.java: %.g Makefile ; $(ANTLR_CMD)
 
-%.tokens: ../../docs/language/%.g Makefile ; $(ANTLR_CMD)
+%.tokens: %.g Makefile ; $(ANTLR_CMD)
 
 clean:
 	rm -f $(CLASS_FILES) $(ANTLR_FILES)
diff --git a/tools/spec_parser/SpecParser.java b/tools/spec_parser/SpecParser.java
index 0f6ba68..cc9d1ea 100644
--- a/tools/spec_parser/SpecParser.java
+++ b/tools/spec_parser/SpecParser.java
@@ -4,13 +4,52 @@
 
 import java.io.*;
 import java.util.*;
-import org.antlr.runtime.*;
+import org.antlr.v4.runtime.*;
+import org.antlr.v4.runtime.dfa.*;
+import org.antlr.v4.runtime.atn.*;
 
 class ParsingResult {
   public int numberOfFileArguments;
   public int numberOfFailures;
 }
 
+class DartErrorListener implements ANTLRErrorListener {
+  public void reportAmbiguity(
+      Parser recognizer,
+      DFA dfa,
+      int startIndex,
+      int stopIndex,
+      boolean exact,
+      BitSet ambigAlts,
+      ATNConfigSet configs) {}
+
+  public void reportAttemptingFullContext(
+      Parser recognizer,
+      DFA dfa,
+      int startIndex,
+      int stopIndex,
+      BitSet conflictingAlts,
+      ATNConfigSet configs) {}
+
+  public void reportContextSensitivity(
+      Parser recognizer,
+      DFA dfa,
+      int startIndex,
+      int stopIndex,
+      int prediction,
+      ATNConfigSet configs) {}
+
+  public void syntaxError(
+      Recognizer<?,?> recognizer,
+      Object offendingSymbol,
+      int line,
+      int charPositionInLine,
+      String msg,
+      RecognitionException e) {
+    if (!DartParser.errorHasOccurred) DartParser.prepareForErrors();
+  }
+}
+
 /// Class for `main` which will parse files given as command line arguments.
 public class SpecParser {
   private static void normalExit() {
@@ -83,8 +122,11 @@
         continue;
       }
       if (verbose) System.err.println("Parsing file: " + filePath);
-      DartParser parser = new DartParser(new CommonTokenStream(
-          new DartLexer(new ANTLRFileStream(filePath))));
+      DartLexer lexer = new DartLexer(new ANTLRFileStream(filePath));
+      DartParser parser = new DartParser(new CommonTokenStream(lexer));
+      ANTLRErrorListener errorListener = new DartErrorListener();
+      lexer.addErrorListener(errorListener);
+      parser.addErrorListener(errorListener);
       if (!parser.parseLibrary(filePath)) result.numberOfFailures++;
     }
     return result;
