| Index: tools/testing/dart/status_expression.dart | 
| diff --git a/tools/testing/dart/status_expression.dart b/tools/testing/dart/status_expression.dart | 
| index 95f175cfe852896fa47a265096485ebcb1168b8b..8fae9e10969f6537ed68b7b1ce11bf7a6ac724aa 100644 | 
| --- a/tools/testing/dart/status_expression.dart | 
| +++ b/tools/testing/dart/status_expression.dart | 
| @@ -8,8 +8,8 @@ library status_expression; | 
| * Parse and evaluate expressions in a .status file for Dart and V8. | 
| * There are set expressions and Boolean expressions in a .status file. | 
| * The grammar is: | 
| - *   BooleanExpression := $variableName == value | $variableName | | 
| - *                        (BooleanExpression) | | 
| + *   BooleanExpression := $variableName == value | $variableName != value | | 
| + *                        $variableName | (BooleanExpression) | | 
| *                        BooleanExpression && BooleanExpression | | 
| *                        BooleanExpression || BooleanExpression | 
| * | 
| @@ -37,6 +37,7 @@ class Token { | 
| static const String DOLLAR_SYMBOL = r"$"; | 
| static const String UNION = ","; | 
| static const String EQUALS = "=="; | 
| +  static const String NOT_EQUALS = "!="; | 
| static const String AND = "&&"; | 
| static const String OR = "||"; | 
| } | 
| @@ -49,10 +50,10 @@ class Tokenizer { | 
| Tokenizer(String this.expression) | 
| : tokens = new List<String>(); | 
|  | 
| -  //  Tokens are : "(", ")", "$", ",", "&&", "||", "==", and (maximal) \w+. | 
| +  // Tokens are : "(", ")", "$", ",", "&&", "||", "==", "!=", and (maximal) \w+. | 
| static final testRegexp = | 
| -      new RegExp(r"^([()$\w\s,]|(\&\&)|(\|\|)|(\=\=))+$"); | 
| -  static final regexp = new RegExp(r"[()$,]|(\&\&)|(\|\|)|(\=\=)|\w+"); | 
| +      new RegExp(r"^([()$\w\s,]|(\&\&)|(\|\|)|(\=\=)|(\!\=))+$"); | 
| +  static final regexp = new RegExp(r"[()$,]|(\&\&)|(\|\|)|(\=\=)|(\!\=)|\w+"); | 
|  | 
| List<String> tokenize() { | 
| if (!testRegexp.hasMatch(expression)) { | 
| @@ -77,12 +78,17 @@ abstract class SetExpression { | 
| class Comparison implements BooleanExpression { | 
| TermVariable left; | 
| TermConstant right; | 
| +  bool negate; | 
|  | 
| -  Comparison(this.left, this.right); | 
| +  Comparison(this.left, this.right, this.negate); | 
|  | 
| -  bool evaluate(environment) => | 
| -      left.termValue(environment) == right.termValue(environment); | 
| -  String toString() => "(\$${left.name} == ${right.value})"; | 
| +  bool evaluate(environment) { | 
| +    return | 
| +        negate != (left.termValue(environment) == right.termValue(environment)); | 
| +  } | 
| + | 
| +  String toString() => | 
| +      "(\$${left.name} ${negate ? '!=' : '=='} ${right.value})"; | 
| } | 
|  | 
|  | 
| @@ -290,7 +296,9 @@ class ExpressionParser { | 
| } | 
| TermVariable left = new TermVariable(scanner.current); | 
| scanner.advance(); | 
| -    if (scanner.current == Token.EQUALS) { | 
| +    if (scanner.current == Token.EQUALS || | 
| +        scanner.current == Token.NOT_EQUALS) { | 
| +      bool negate = scanner.current == Token.NOT_EQUALS; | 
| scanner.advance(); | 
| if (!new RegExp(r"^\w+$").hasMatch(scanner.current)) { | 
| throw new RuntimeError( | 
| @@ -298,7 +306,7 @@ class ExpressionParser { | 
| } | 
| TermConstant right = new TermConstant(scanner.current); | 
| scanner.advance(); | 
| -      return new Comparison(left, right); | 
| +      return new Comparison(left, right, negate); | 
| } else { | 
| return new BooleanVariable(left); | 
| } | 
|  |