Chromium Code Reviews| 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..bae273f04210b483ebdaf4895d97f2c5ced29af5 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+. |
|
ricow1
2013/05/24 10:54:38
Long line
kustermann
2013/05/24 11:00:34
Done.
|
| 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) { |
| + var equals = left.termValue(environment) == right.termValue(environment); |
| + return negate ? !equals : equals; |
|
Bill Hesse
2013/05/24 10:53:23
How about
return negate != (left... == right....);
kustermann
2013/05/24 11:00:34
Done.
|
| + } |
| + |
| + 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); |
| } |