| OLD | NEW |
| 1 // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 import '../environment.dart'; | 5 import '../environment.dart'; |
| 6 | 6 |
| 7 /// A parsed Boolean expression AST. | 7 /// A parsed Boolean expression AST. |
| 8 abstract class Expression { | 8 abstract class Expression { |
| 9 /// Parses Boolean expressions in a .status file for Dart. | 9 /// Parses Boolean expressions in a .status file for Dart. |
| 10 /// | 10 /// |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 84 _ComparisonExpression(this.left, this.right, this.negate); | 84 _ComparisonExpression(this.left, this.right, this.negate); |
| 85 | 85 |
| 86 void validate(Environment environment, List<String> errors) { | 86 void validate(Environment environment, List<String> errors) { |
| 87 environment.validate(left.name, right, errors); | 87 environment.validate(left.name, right, errors); |
| 88 } | 88 } |
| 89 | 89 |
| 90 bool evaluate(Environment environment) { | 90 bool evaluate(Environment environment) { |
| 91 return negate != (left.lookup(environment) == right); | 91 return negate != (left.lookup(environment) == right); |
| 92 } | 92 } |
| 93 | 93 |
| 94 String toString() => "(\$${left.name} ${negate ? '!=' : '=='} $right)"; | 94 String toString() => "\$${left.name} ${negate ? '!=' : '=='} $right"; |
| 95 } | 95 } |
| 96 | 96 |
| 97 /// A reference to a variable defined in the environment. The expression | 97 /// A reference to a variable defined in the environment. The expression |
| 98 /// evaluates to true if the variable's stringified value is "true". | 98 /// evaluates to true if the variable's stringified value is "true". |
| 99 /// ``` | 99 /// ``` |
| 100 /// $variable | 100 /// $variable |
| 101 /// ``` | 101 /// ``` |
| 102 /// is equivalent to | 102 /// is equivalent to |
| 103 /// ``` | 103 /// ``` |
| 104 /// $variable == true | 104 /// $variable == true |
| (...skipping 13 matching lines...) Expand all Loading... |
| 118 _VariableExpression(this.variable, {this.negate = false}); | 118 _VariableExpression(this.variable, {this.negate = false}); |
| 119 | 119 |
| 120 void validate(Environment environment, List<String> errors) { | 120 void validate(Environment environment, List<String> errors) { |
| 121 // It must be a Boolean, so it should allow either Boolean value. | 121 // It must be a Boolean, so it should allow either Boolean value. |
| 122 environment.validate(variable.name, "true", errors); | 122 environment.validate(variable.name, "true", errors); |
| 123 } | 123 } |
| 124 | 124 |
| 125 bool evaluate(Environment environment) => | 125 bool evaluate(Environment environment) => |
| 126 negate != (variable.lookup(environment) == "true"); | 126 negate != (variable.lookup(environment) == "true"); |
| 127 | 127 |
| 128 String toString() => "(bool ${negate ? "! " : ""}\$${variable.name})"; | 128 String toString() => "${negate ? "!" : ""}\$${variable.name}"; |
| 129 } | 129 } |
| 130 | 130 |
| 131 /// A logical `||` or `&&` expression. | 131 /// A logical `||` or `&&` expression. |
| 132 class _LogicExpression implements Expression { | 132 class _LogicExpression implements Expression { |
| 133 /// The operator, `||` or `&&`. | 133 /// The operator, `||` or `&&`. |
| 134 final String op; | 134 final String op; |
| 135 | 135 |
| 136 final Expression left; | 136 final Expression left; |
| 137 final Expression right; | 137 final Expression right; |
| 138 | 138 |
| 139 _LogicExpression(this.op, this.left, this.right); | 139 _LogicExpression(this.op, this.left, this.right); |
| 140 | 140 |
| 141 void validate(Environment environment, List<String> errors) { | 141 void validate(Environment environment, List<String> errors) { |
| 142 left.validate(environment, errors); | 142 left.validate(environment, errors); |
| 143 right.validate(environment, errors); | 143 right.validate(environment, errors); |
| 144 } | 144 } |
| 145 | 145 |
| 146 bool evaluate(Environment environment) => (op == _Token.and) | 146 bool evaluate(Environment environment) => (op == _Token.and) |
| 147 ? left.evaluate(environment) && right.evaluate(environment) | 147 ? left.evaluate(environment) && right.evaluate(environment) |
| 148 : left.evaluate(environment) || right.evaluate(environment); | 148 : left.evaluate(environment) || right.evaluate(environment); |
| 149 | 149 |
| 150 String toString() => "($left $op $right)"; | 150 String toString() { |
| 151 String parenthesize(Expression operand) { |
| 152 var result = operand.toString(); |
| 153 if (op == "&&" && operand is _LogicExpression && operand.op == "||") { |
| 154 result = "($result)"; |
| 155 } |
| 156 |
| 157 return result; |
| 158 } |
| 159 |
| 160 return "${parenthesize(left)} $op ${parenthesize(right)}"; |
| 161 } |
| 151 } | 162 } |
| 152 | 163 |
| 153 /// Parser for Boolean expressions in a .status file for Dart. | 164 /// Parser for Boolean expressions in a .status file for Dart. |
| 154 class _ExpressionParser { | 165 class _ExpressionParser { |
| 155 final _Scanner _scanner; | 166 final _Scanner _scanner; |
| 156 | 167 |
| 157 _ExpressionParser(String expression) : _scanner = new _Scanner(expression); | 168 _ExpressionParser(String expression) : _scanner = new _Scanner(expression); |
| 158 | 169 |
| 159 Expression parse() { | 170 Expression parse() { |
| 160 var expression = _parseOr(); | 171 var expression = _parseOr(); |
| (...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 283 return true; | 294 return true; |
| 284 } | 295 } |
| 285 | 296 |
| 286 /// Consumes the current token and returns it. | 297 /// Consumes the current token and returns it. |
| 287 String advance() { | 298 String advance() { |
| 288 var previous = current; | 299 var previous = current; |
| 289 current = tokenIterator.moveNext() ? tokenIterator.current : null; | 300 current = tokenIterator.moveNext() ? tokenIterator.current : null; |
| 290 return previous; | 301 return previous; |
| 291 } | 302 } |
| 292 } | 303 } |
| OLD | NEW |