| 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);
 | 
|      }
 | 
| 
 |