Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(7)

Side by Side Diff: tools/testing/dart/status_expression.dart

Issue 1859973002: Autoformat tools/testing/dart (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Format whole directory Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2011, 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 library status_expression; 5 library status_expression;
6 6
7 /** 7 /**
8 * Parse and evaluate expressions in a .status file for Dart and V8. 8 * Parse and evaluate expressions in a .status file for Dart and V8.
9 * There are set expressions and Boolean expressions in a .status file. 9 * There are set expressions and Boolean expressions in a .status file.
10 * The grammar is: 10 * The grammar is:
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
42 static const String LEFT_PAREN = "("; 42 static const String LEFT_PAREN = "(";
43 static const String RIGHT_PAREN = ")"; 43 static const String RIGHT_PAREN = ")";
44 static const String DOLLAR_SYMBOL = r"$"; 44 static const String DOLLAR_SYMBOL = r"$";
45 static const String UNION = ","; 45 static const String UNION = ",";
46 static const String EQUALS = "=="; 46 static const String EQUALS = "==";
47 static const String NOT_EQUALS = "!="; 47 static const String NOT_EQUALS = "!=";
48 static const String AND = "&&"; 48 static const String AND = "&&";
49 static const String OR = "||"; 49 static const String OR = "||";
50 } 50 }
51 51
52
53 class Tokenizer { 52 class Tokenizer {
54 String expression; 53 String expression;
55 List<String> tokens; 54 List<String> tokens;
56 55
57 Tokenizer(String this.expression) 56 Tokenizer(String this.expression) : tokens = new List<String>();
58 : tokens = new List<String>();
59 57
60 // Tokens are : "(", ")", "$", ",", "&&", "||", "==", "!=", and (maximal) \w+. 58 // Tokens are : "(", ")", "$", ",", "&&", "||", "==", "!=", and (maximal) \w+.
61 static final testRegexp = 59 static final testRegexp =
62 new RegExp(r"^([()$\w\s,]|(\&\&)|(\|\|)|(\=\=)|(\!\=))+$"); 60 new RegExp(r"^([()$\w\s,]|(\&\&)|(\|\|)|(\=\=)|(\!\=))+$");
63 static final regexp = new RegExp(r"[()$,]|(\&\&)|(\|\|)|(\=\=)|(\!\=)|\w+"); 61 static final regexp = new RegExp(r"[()$,]|(\&\&)|(\|\|)|(\=\=)|(\!\=)|\w+");
64 62
65 List<String> tokenize() { 63 List<String> tokenize() {
66 if (!testRegexp.hasMatch(expression)) { 64 if (!testRegexp.hasMatch(expression)) {
67 throw new FormatException("Syntax error in '$expression'"); 65 throw new FormatException("Syntax error in '$expression'");
68 } 66 }
69 for (Match match in regexp.allMatches(expression)) tokens.add(match[0]); 67 for (Match match in regexp.allMatches(expression)) tokens.add(match[0]);
70 return tokens; 68 return tokens;
71 } 69 }
72 } 70 }
73 71
74
75 abstract class BooleanExpression { 72 abstract class BooleanExpression {
76 bool evaluate(Map<String, String> environment); 73 bool evaluate(Map<String, String> environment);
77 } 74 }
78 75
79
80 abstract class SetExpression { 76 abstract class SetExpression {
81 Set<String> evaluate(Map<String, String> environment); 77 Set<String> evaluate(Map<String, String> environment);
82 } 78 }
83 79
84
85 class Comparison implements BooleanExpression { 80 class Comparison implements BooleanExpression {
86 TermVariable left; 81 TermVariable left;
87 TermConstant right; 82 TermConstant right;
88 bool negate; 83 bool negate;
89 84
90 Comparison(this.left, this.right, this.negate); 85 Comparison(this.left, this.right, this.negate);
91 86
92 bool evaluate(environment) { 87 bool evaluate(environment) {
93 return 88 return negate !=
94 negate != (left.termValue(environment) == right.termValue(environment)); 89 (left.termValue(environment) == right.termValue(environment));
95 } 90 }
96 91
97 String toString() => 92 String toString() =>
98 "(\$${left.name} ${negate ? '!=' : '=='} ${right.value})"; 93 "(\$${left.name} ${negate ? '!=' : '=='} ${right.value})";
99 } 94 }
100 95
101
102 class TermVariable { 96 class TermVariable {
103 String name; 97 String name;
104 98
105 TermVariable(this.name); 99 TermVariable(this.name);
106 100
107 String termValue(environment) { 101 String termValue(environment) {
108 var value = environment[name]; 102 var value = environment[name];
109 if (value == null) { 103 if (value == null) {
110 throw new ExprEvaluationException( 104 throw new ExprEvaluationException("Could not find '$name' in environment "
111 "Could not find '$name' in environment "
112 "while evaluating status file expression."); 105 "while evaluating status file expression.");
113 } 106 }
114 return value.toString(); 107 return value.toString();
115 } 108 }
116 } 109 }
117 110
118
119 class TermConstant { 111 class TermConstant {
120 String value; 112 String value;
121 113
122 TermConstant(String this.value); 114 TermConstant(String this.value);
123 115
124 String termValue(environment) => value; 116 String termValue(environment) => value;
125 } 117 }
126 118
127
128 class BooleanVariable implements BooleanExpression { 119 class BooleanVariable implements BooleanExpression {
129 TermVariable variable; 120 TermVariable variable;
130 121
131 BooleanVariable(this.variable); 122 BooleanVariable(this.variable);
132 123
133 bool evaluate(environment) => variable.termValue(environment) == 'true'; 124 bool evaluate(environment) => variable.termValue(environment) == 'true';
134 String toString() => "(bool \$${variable.name})"; 125 String toString() => "(bool \$${variable.name})";
135 } 126 }
136 127
137
138 class BooleanOperation implements BooleanExpression { 128 class BooleanOperation implements BooleanExpression {
139 String op; 129 String op;
140 BooleanExpression left; 130 BooleanExpression left;
141 BooleanExpression right; 131 BooleanExpression right;
142 132
143 BooleanOperation(this.op, this.left, this.right); 133 BooleanOperation(this.op, this.left, this.right);
144 134
145 bool evaluate(environment) => (op == Token.AND) ? 135 bool evaluate(environment) => (op == Token.AND)
146 left.evaluate(environment) && right.evaluate(environment) : 136 ? left.evaluate(environment) && right.evaluate(environment)
147 left.evaluate(environment) || right.evaluate(environment); 137 : left.evaluate(environment) || right.evaluate(environment);
148 String toString() => "($left $op $right)"; 138 String toString() => "($left $op $right)";
149 } 139 }
150 140
151
152 class SetUnion implements SetExpression { 141 class SetUnion implements SetExpression {
153 SetExpression left; 142 SetExpression left;
154 SetExpression right; 143 SetExpression right;
155 144
156 SetUnion(this.left, this.right); 145 SetUnion(this.left, this.right);
157 146
158 // Overwrites left.evaluate(env). 147 // Overwrites left.evaluate(env).
159 // Set.addAll does not return this. 148 // Set.addAll does not return this.
160 Set<String> evaluate(environment) { 149 Set<String> evaluate(environment) {
161 Set<String> result = left.evaluate(environment); 150 Set<String> result = left.evaluate(environment);
162 result.addAll(right.evaluate(environment)); 151 result.addAll(right.evaluate(environment));
163 return result; 152 return result;
164 } 153 }
165 154
166 String toString() => "($left || $right)"; 155 String toString() => "($left || $right)";
167 } 156 }
168 157
169
170 class SetIf implements SetExpression { 158 class SetIf implements SetExpression {
171 SetExpression left; 159 SetExpression left;
172 BooleanExpression right; 160 BooleanExpression right;
173 161
174 SetIf(this.left, this.right); 162 SetIf(this.left, this.right);
175 163
176 Set<String> evaluate(environment) => right.evaluate(environment) ? 164 Set<String> evaluate(environment) => right.evaluate(environment)
177 left.evaluate(environment) : new Set<String>(); 165 ? left.evaluate(environment)
166 : new Set<String>();
178 String toString() => "($left if $right)"; 167 String toString() => "($left if $right)";
179 } 168 }
180 169
181
182 class SetConstant implements SetExpression { 170 class SetConstant implements SetExpression {
183 String value; 171 String value;
184 172
185 SetConstant(String v) : value = v.toLowerCase(); 173 SetConstant(String v) : value = v.toLowerCase();
186 174
187 Set<String> evaluate(environment) => new Set<String>.from([value]); 175 Set<String> evaluate(environment) => new Set<String>.from([value]);
188 String toString() => value; 176 String toString() => value;
189 } 177 }
190 178
191
192 // An iterator that allows peeking at the current token. 179 // An iterator that allows peeking at the current token.
193 class Scanner { 180 class Scanner {
194 List<String> tokens; 181 List<String> tokens;
195 Iterator tokenIterator; 182 Iterator tokenIterator;
196 String current; 183 String current;
197 184
198 Scanner(this.tokens) { 185 Scanner(this.tokens) {
199 tokenIterator = tokens.iterator; 186 tokenIterator = tokens.iterator;
200 advance(); 187 advance();
201 } 188 }
202 189
203 bool hasMore() => current != null; 190 bool hasMore() => current != null;
204 191
205 void advance() { 192 void advance() {
206 current = tokenIterator.moveNext() ? tokenIterator.current : null; 193 current = tokenIterator.moveNext() ? tokenIterator.current : null;
207 } 194 }
208 } 195 }
209 196
210
211 class ExpressionParser { 197 class ExpressionParser {
212 Scanner scanner; 198 Scanner scanner;
213 199
214 ExpressionParser(this.scanner); 200 ExpressionParser(this.scanner);
215 201
216 SetExpression parseSetExpression() => parseSetUnion(); 202 SetExpression parseSetExpression() => parseSetUnion();
217 203
218 SetExpression parseSetUnion() { 204 SetExpression parseSetUnion() {
219 SetExpression left = parseSetIf(); 205 SetExpression left = parseSetIf();
220 while (scanner.hasMore() && scanner.current == Token.UNION){ 206 while (scanner.hasMore() && scanner.current == Token.UNION) {
221 scanner.advance(); 207 scanner.advance();
222 SetExpression right = parseSetIf(); 208 SetExpression right = parseSetIf();
223 left = new SetUnion(left, right); 209 left = new SetUnion(left, right);
224 } 210 }
225 return left; 211 return left;
226 } 212 }
227 213
228 SetExpression parseSetIf() { 214 SetExpression parseSetIf() {
229 SetExpression left = parseSetOr(); 215 SetExpression left = parseSetOr();
230 while (scanner.hasMore() && scanner.current == "if") { 216 while (scanner.hasMore() && scanner.current == "if") {
231 scanner.advance(); 217 scanner.advance();
232 BooleanExpression right = parseBooleanExpression(); 218 BooleanExpression right = parseBooleanExpression();
233 left = new SetIf(left, right); 219 left = new SetIf(left, right);
234 } 220 }
235 return left; 221 return left;
236 } 222 }
237 223
238 SetExpression parseSetOr() { 224 SetExpression parseSetOr() {
239 SetExpression left = parseSetAtomic(); 225 SetExpression left = parseSetAtomic();
240 while (scanner.hasMore() && scanner.current == Token.OR){ 226 while (scanner.hasMore() && scanner.current == Token.OR) {
241 scanner.advance(); 227 scanner.advance();
242 SetExpression right = parseSetAtomic(); 228 SetExpression right = parseSetAtomic();
243 left = new SetUnion(left, right); 229 left = new SetUnion(left, right);
244 } 230 }
245 return left; 231 return left;
246 } 232 }
247 233
248
249 SetExpression parseSetAtomic() { 234 SetExpression parseSetAtomic() {
250 if (scanner.current == Token.LEFT_PAREN) { 235 if (scanner.current == Token.LEFT_PAREN) {
251 scanner.advance(); 236 scanner.advance();
252 SetExpression value = parseSetExpression(); 237 SetExpression value = parseSetExpression();
253 if (scanner.current != Token.RIGHT_PAREN) { 238 if (scanner.current != Token.RIGHT_PAREN) {
254 throw new FormatException("Missing right parenthesis in expression"); 239 throw new FormatException("Missing right parenthesis in expression");
255 } 240 }
256 scanner.advance(); 241 scanner.advance();
257 return value; 242 return value;
258 } 243 }
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
320 "Expected value in expression, got ${scanner.current}"); 305 "Expected value in expression, got ${scanner.current}");
321 } 306 }
322 TermConstant right = new TermConstant(scanner.current); 307 TermConstant right = new TermConstant(scanner.current);
323 scanner.advance(); 308 scanner.advance();
324 return new Comparison(left, right, negate); 309 return new Comparison(left, right, negate);
325 } else { 310 } else {
326 return new BooleanVariable(left); 311 return new BooleanVariable(left);
327 } 312 }
328 } 313 }
329 } 314 }
330
OLDNEW
« no previous file with comments | « tools/testing/dart/runtime_configuration.dart ('k') | tools/testing/dart/status_file_parser.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698