| OLD | NEW |
| 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2015, 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 fasta.scanner.precedence; | 5 library fasta.scanner.precedence; |
| 6 | 6 |
| 7 import '../../scanner/token.dart'; | 7 import '../../scanner/token.dart'; |
| 8 import 'token_constants.dart'; | 8 import 'token_constants.dart'; |
| 9 | 9 |
| 10 class PrecedenceInfo implements TokenType { | 10 class PrecedenceInfo extends TokenType { |
| 11 final String value; | 11 const PrecedenceInfo(String value, String name, int precedence, int kind, |
| 12 final String name; | 12 {bool isOperator: false, bool isUserDefinableOperator: false}) |
| 13 final int precedence; | 13 : super(value, name, precedence, kind, |
| 14 final int kind; | 14 isOperator: isOperator, |
| 15 final bool isOperator; | 15 isUserDefinableOperator: isUserDefinableOperator); |
| 16 final bool isUserDefinableOperator; | |
| 17 | |
| 18 const PrecedenceInfo(this.value, this.name, this.precedence, this.kind, | |
| 19 {this.isOperator: false, this.isUserDefinableOperator: false}); | |
| 20 | 16 |
| 21 toString() => 'PrecedenceInfo($value, $name, $precedence, $kind)'; | 17 toString() => 'PrecedenceInfo($value, $name, $precedence, $kind)'; |
| 22 | 18 |
| 23 static const List<PrecedenceInfo> all = const <PrecedenceInfo>[ | 19 static const List<PrecedenceInfo> all = const <PrecedenceInfo>[ |
| 24 BACKPING_INFO, | 20 BACKPING_INFO, |
| 25 BACKSLASH_INFO, | 21 BACKSLASH_INFO, |
| 26 PERIOD_PERIOD_PERIOD_INFO, | 22 PERIOD_PERIOD_PERIOD_INFO, |
| 27 PERIOD_PERIOD_INFO, | 23 PERIOD_PERIOD_INFO, |
| 28 BANG_INFO, | 24 BANG_INFO, |
| 29 COLON_INFO, | 25 COLON_INFO, |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 91 CLOSE_SQUARE_BRACKET_INFO, | 87 CLOSE_SQUARE_BRACKET_INFO, |
| 92 DOUBLE_INFO, | 88 DOUBLE_INFO, |
| 93 STRING_INTERPOLATION_INFO, | 89 STRING_INTERPOLATION_INFO, |
| 94 STRING_INTERPOLATION_IDENTIFIER_INFO, | 90 STRING_INTERPOLATION_IDENTIFIER_INFO, |
| 95 HEXADECIMAL_INFO, | 91 HEXADECIMAL_INFO, |
| 96 SINGLE_LINE_COMMENT_INFO, | 92 SINGLE_LINE_COMMENT_INFO, |
| 97 MULTI_LINE_COMMENT_INFO, | 93 MULTI_LINE_COMMENT_INFO, |
| 98 GENERIC_METHOD_TYPE_ASSIGN, | 94 GENERIC_METHOD_TYPE_ASSIGN, |
| 99 GENERIC_METHOD_TYPE_LIST, | 95 GENERIC_METHOD_TYPE_LIST, |
| 100 ]; | 96 ]; |
| 97 } |
| 101 | 98 |
| 102 @override | 99 const int NO_PRECEDENCE = 0; |
| 103 bool get isAdditiveOperator => precedence == ADDITIVE_PRECEDENCE; | 100 const int ASSIGNMENT_PRECEDENCE = 1; |
| 104 | 101 const int CASCADE_PRECEDENCE = 2; |
| 105 @override | 102 const int CONDITIONAL_PRECEDENCE = 3; |
| 106 bool get isAssignmentOperator => precedence == ASSIGNMENT_PRECEDENCE; | 103 const int IF_NULL_PRECEDENCE = 4; |
| 107 | 104 const int LOGICAL_OR_PRECEDENCE = 5; |
| 108 @override | 105 const int LOGICAL_AND_PRECEDENCE = 6; |
| 109 bool get isAssociativeOperator => | 106 const int EQUALITY_PRECEDENCE = 7; |
| 110 this == AMPERSAND_INFO || | 107 const int RELATIONAL_PRECEDENCE = 8; |
| 111 this == AMPERSAND_AMPERSAND_INFO || | 108 const int BITWISE_OR_PRECEDENCE = 9; |
| 112 this == BAR_INFO || | 109 const int BITWISE_XOR_PRECEDENCE = 10; |
| 113 this == BAR_BAR_INFO || | 110 const int BITWISE_AND_PRECEDENCE = 11; |
| 114 this == CARET_INFO || | 111 const int SHIFT_PRECEDENCE = 12; |
| 115 this == PLUS_INFO || | 112 const int ADDITIVE_PRECEDENCE = 13; |
| 116 this == STAR_INFO; | 113 const int MULTIPLICATIVE_PRECEDENCE = 14; |
| 117 | 114 const int PREFIX_PRECEDENCE = 15; |
| 118 @override | 115 const int POSTFIX_PRECEDENCE = 16; |
| 119 bool get isEqualityOperator => this == BANG_EQ_INFO || this == EQ_EQ_INFO; | |
| 120 | |
| 121 @override | |
| 122 bool get isIncrementOperator => | |
| 123 this == PLUS_PLUS_INFO || this == MINUS_MINUS_INFO; | |
| 124 | |
| 125 @override | |
| 126 bool get isMultiplicativeOperator => precedence == MULTIPLICATIVE_PRECEDENCE; | |
| 127 | |
| 128 @override | |
| 129 bool get isRelationalOperator => | |
| 130 this == LT_INFO || | |
| 131 this == LT_EQ_INFO || | |
| 132 this == GT_INFO || | |
| 133 this == GT_EQ_INFO; | |
| 134 | |
| 135 @override | |
| 136 bool get isShiftOperator => precedence == SHIFT_PRECEDENCE; | |
| 137 | |
| 138 @override | |
| 139 bool get isUnaryPostfixOperator => precedence == POSTFIX_PRECEDENCE; | |
| 140 | |
| 141 @override | |
| 142 bool get isUnaryPrefixOperator => | |
| 143 precedence == PREFIX_PRECEDENCE || | |
| 144 this == PLUS_PLUS_INFO || | |
| 145 this == MINUS_MINUS_INFO; | |
| 146 | |
| 147 @override | |
| 148 String get lexeme => value; | |
| 149 } | |
| 150 | 116 |
| 151 // TODO(ahe): The following are not tokens in Dart. | 117 // TODO(ahe): The following are not tokens in Dart. |
| 152 const PrecedenceInfo BACKPING_INFO = | 118 const PrecedenceInfo BACKPING_INFO = |
| 153 const PrecedenceInfo('`', 'BACKPING', 0, BACKPING_TOKEN); | 119 const PrecedenceInfo('`', 'BACKPING', NO_PRECEDENCE, BACKPING_TOKEN); |
| 154 const PrecedenceInfo BACKSLASH_INFO = | 120 const PrecedenceInfo BACKSLASH_INFO = |
| 155 const PrecedenceInfo('\\', 'BACKSLASH', 0, BACKSLASH_TOKEN); | 121 const PrecedenceInfo('\\', 'BACKSLASH', NO_PRECEDENCE, BACKSLASH_TOKEN); |
| 156 const PrecedenceInfo PERIOD_PERIOD_PERIOD_INFO = const PrecedenceInfo( | 122 const PrecedenceInfo PERIOD_PERIOD_PERIOD_INFO = const PrecedenceInfo( |
| 157 '...', 'PERIOD_PERIOD_PERIOD', 0, PERIOD_PERIOD_PERIOD_TOKEN); | 123 '...', 'PERIOD_PERIOD_PERIOD', NO_PRECEDENCE, PERIOD_PERIOD_PERIOD_TOKEN); |
| 158 | 124 |
| 159 /** | 125 /** |
| 160 * The cascade operator has the lowest precedence of any operator | 126 * The cascade operator has the lowest precedence of any operator |
| 161 * except assignment. | 127 * except assignment. |
| 162 */ | 128 */ |
| 163 const int CASCADE_PRECEDENCE = 2; | |
| 164 const PrecedenceInfo PERIOD_PERIOD_INFO = const PrecedenceInfo( | 129 const PrecedenceInfo PERIOD_PERIOD_INFO = const PrecedenceInfo( |
| 165 '..', 'PERIOD_PERIOD', CASCADE_PRECEDENCE, PERIOD_PERIOD_TOKEN, | 130 '..', 'PERIOD_PERIOD', CASCADE_PRECEDENCE, PERIOD_PERIOD_TOKEN, |
| 166 isOperator: true); | 131 isOperator: true); |
| 167 | 132 |
| 168 const int PREFIX_PRECEDENCE = 15; | |
| 169 const PrecedenceInfo BANG_INFO = const PrecedenceInfo( | 133 const PrecedenceInfo BANG_INFO = const PrecedenceInfo( |
| 170 '!', 'BANG', PREFIX_PRECEDENCE, BANG_TOKEN, | 134 '!', 'BANG', PREFIX_PRECEDENCE, BANG_TOKEN, |
| 171 isOperator: true); | 135 isOperator: true); |
| 172 const PrecedenceInfo COLON_INFO = | 136 const PrecedenceInfo COLON_INFO = |
| 173 const PrecedenceInfo(':', 'COLON', 0, COLON_TOKEN); | 137 const PrecedenceInfo(':', 'COLON', NO_PRECEDENCE, COLON_TOKEN); |
| 174 const PrecedenceInfo INDEX_INFO = const PrecedenceInfo( | 138 const PrecedenceInfo INDEX_INFO = const PrecedenceInfo( |
| 175 '[]', 'INDEX', 0, INDEX_TOKEN, | 139 '[]', 'INDEX', NO_PRECEDENCE, INDEX_TOKEN, |
| 176 isOperator: true, isUserDefinableOperator: true); | 140 isOperator: true, isUserDefinableOperator: true); |
| 177 const PrecedenceInfo MINUS_MINUS_INFO = const PrecedenceInfo( | 141 const PrecedenceInfo MINUS_MINUS_INFO = const PrecedenceInfo( |
| 178 '--', 'MINUS_MINUS', POSTFIX_PRECEDENCE, MINUS_MINUS_TOKEN, | 142 '--', 'MINUS_MINUS', POSTFIX_PRECEDENCE, MINUS_MINUS_TOKEN, |
| 179 isOperator: true); | 143 isOperator: true); |
| 180 const PrecedenceInfo PLUS_PLUS_INFO = const PrecedenceInfo( | 144 const PrecedenceInfo PLUS_PLUS_INFO = const PrecedenceInfo( |
| 181 '++', 'PLUS_PLUS', POSTFIX_PRECEDENCE, PLUS_PLUS_TOKEN, | 145 '++', 'PLUS_PLUS', POSTFIX_PRECEDENCE, PLUS_PLUS_TOKEN, |
| 182 isOperator: true); | 146 isOperator: true); |
| 183 const PrecedenceInfo TILDE_INFO = const PrecedenceInfo( | 147 const PrecedenceInfo TILDE_INFO = const PrecedenceInfo( |
| 184 '~', 'TILDE', PREFIX_PRECEDENCE, TILDE_TOKEN, | 148 '~', 'TILDE', PREFIX_PRECEDENCE, TILDE_TOKEN, |
| 185 isOperator: true, isUserDefinableOperator: true); | 149 isOperator: true, isUserDefinableOperator: true); |
| 186 | 150 |
| 187 const PrecedenceInfo FUNCTION_INFO = | 151 const PrecedenceInfo FUNCTION_INFO = |
| 188 const PrecedenceInfo('=>', 'FUNCTION', 0, FUNCTION_TOKEN); | 152 const PrecedenceInfo('=>', 'FUNCTION', NO_PRECEDENCE, FUNCTION_TOKEN); |
| 189 const PrecedenceInfo HASH_INFO = | 153 const PrecedenceInfo HASH_INFO = |
| 190 const PrecedenceInfo('#', 'HASH', 0, HASH_TOKEN); | 154 const PrecedenceInfo('#', 'HASH', NO_PRECEDENCE, HASH_TOKEN); |
| 191 const PrecedenceInfo INDEX_EQ_INFO = const PrecedenceInfo( | 155 const PrecedenceInfo INDEX_EQ_INFO = const PrecedenceInfo( |
| 192 '[]=', 'INDEX_EQ', 0, INDEX_EQ_TOKEN, | 156 '[]=', 'INDEX_EQ', NO_PRECEDENCE, INDEX_EQ_TOKEN, |
| 193 isOperator: true, isUserDefinableOperator: true); | 157 isOperator: true, isUserDefinableOperator: true); |
| 194 const PrecedenceInfo SEMICOLON_INFO = | 158 const PrecedenceInfo SEMICOLON_INFO = |
| 195 const PrecedenceInfo(';', 'SEMICOLON', 0, SEMICOLON_TOKEN); | 159 const PrecedenceInfo(';', 'SEMICOLON', NO_PRECEDENCE, SEMICOLON_TOKEN); |
| 196 const PrecedenceInfo COMMA_INFO = | 160 const PrecedenceInfo COMMA_INFO = |
| 197 const PrecedenceInfo(',', 'COMMA', 0, COMMA_TOKEN); | 161 const PrecedenceInfo(',', 'COMMA', NO_PRECEDENCE, COMMA_TOKEN); |
| 198 | 162 |
| 199 const PrecedenceInfo AT_INFO = const PrecedenceInfo('@', 'AT', 0, AT_TOKEN); | 163 const PrecedenceInfo AT_INFO = |
| 164 const PrecedenceInfo('@', 'AT', NO_PRECEDENCE, AT_TOKEN); |
| 200 | 165 |
| 201 // Assignment operators. | 166 // Assignment operators. |
| 202 const int ASSIGNMENT_PRECEDENCE = 1; | |
| 203 const PrecedenceInfo AMPERSAND_EQ_INFO = const PrecedenceInfo( | 167 const PrecedenceInfo AMPERSAND_EQ_INFO = const PrecedenceInfo( |
| 204 '&=', 'AMPERSAND_EQ', ASSIGNMENT_PRECEDENCE, AMPERSAND_EQ_TOKEN, | 168 '&=', 'AMPERSAND_EQ', ASSIGNMENT_PRECEDENCE, AMPERSAND_EQ_TOKEN, |
| 205 isOperator: true); | 169 isOperator: true); |
| 206 const PrecedenceInfo BAR_EQ_INFO = const PrecedenceInfo( | 170 const PrecedenceInfo BAR_EQ_INFO = const PrecedenceInfo( |
| 207 '|=', 'BAR_EQ', ASSIGNMENT_PRECEDENCE, BAR_EQ_TOKEN, | 171 '|=', 'BAR_EQ', ASSIGNMENT_PRECEDENCE, BAR_EQ_TOKEN, |
| 208 isOperator: true); | 172 isOperator: true); |
| 209 const PrecedenceInfo CARET_EQ_INFO = const PrecedenceInfo( | 173 const PrecedenceInfo CARET_EQ_INFO = const PrecedenceInfo( |
| 210 '^=', 'CARET_EQ', ASSIGNMENT_PRECEDENCE, CARET_EQ_TOKEN, | 174 '^=', 'CARET_EQ', ASSIGNMENT_PRECEDENCE, CARET_EQ_TOKEN, |
| 211 isOperator: true); | 175 isOperator: true); |
| 212 const PrecedenceInfo EQ_INFO = const PrecedenceInfo( | 176 const PrecedenceInfo EQ_INFO = const PrecedenceInfo( |
| (...skipping 20 matching lines...) Expand all Loading... |
| 233 const PrecedenceInfo STAR_EQ_INFO = const PrecedenceInfo( | 197 const PrecedenceInfo STAR_EQ_INFO = const PrecedenceInfo( |
| 234 '*=', 'STAR_EQ', ASSIGNMENT_PRECEDENCE, STAR_EQ_TOKEN, | 198 '*=', 'STAR_EQ', ASSIGNMENT_PRECEDENCE, STAR_EQ_TOKEN, |
| 235 isOperator: true); | 199 isOperator: true); |
| 236 const PrecedenceInfo TILDE_SLASH_EQ_INFO = const PrecedenceInfo( | 200 const PrecedenceInfo TILDE_SLASH_EQ_INFO = const PrecedenceInfo( |
| 237 '~/=', 'TILDE_SLASH_EQ', ASSIGNMENT_PRECEDENCE, TILDE_SLASH_EQ_TOKEN, | 201 '~/=', 'TILDE_SLASH_EQ', ASSIGNMENT_PRECEDENCE, TILDE_SLASH_EQ_TOKEN, |
| 238 isOperator: true); | 202 isOperator: true); |
| 239 const PrecedenceInfo QUESTION_QUESTION_EQ_INFO = const PrecedenceInfo('??=', | 203 const PrecedenceInfo QUESTION_QUESTION_EQ_INFO = const PrecedenceInfo('??=', |
| 240 'QUESTION_QUESTION_EQ', ASSIGNMENT_PRECEDENCE, QUESTION_QUESTION_EQ_TOKEN, | 204 'QUESTION_QUESTION_EQ', ASSIGNMENT_PRECEDENCE, QUESTION_QUESTION_EQ_TOKEN, |
| 241 isOperator: true); | 205 isOperator: true); |
| 242 | 206 |
| 243 const PrecedenceInfo QUESTION_INFO = | 207 const PrecedenceInfo QUESTION_INFO = const PrecedenceInfo( |
| 244 const PrecedenceInfo('?', 'QUESTION', 3, QUESTION_TOKEN, isOperator: true); | 208 '?', 'QUESTION', CONDITIONAL_PRECEDENCE, QUESTION_TOKEN, |
| 209 isOperator: true); |
| 245 | 210 |
| 246 const PrecedenceInfo QUESTION_QUESTION_INFO = const PrecedenceInfo( | 211 const PrecedenceInfo QUESTION_QUESTION_INFO = const PrecedenceInfo( |
| 247 '??', 'QUESTION_QUESTION', 4, QUESTION_QUESTION_TOKEN, | 212 '??', 'QUESTION_QUESTION', IF_NULL_PRECEDENCE, QUESTION_QUESTION_TOKEN, |
| 248 isOperator: true); | 213 isOperator: true); |
| 249 | 214 |
| 250 const PrecedenceInfo BAR_BAR_INFO = | 215 const PrecedenceInfo BAR_BAR_INFO = const PrecedenceInfo( |
| 251 const PrecedenceInfo('||', 'BAR_BAR', 5, BAR_BAR_TOKEN, isOperator: true); | 216 '||', 'BAR_BAR', LOGICAL_OR_PRECEDENCE, BAR_BAR_TOKEN, |
| 252 | |
| 253 const PrecedenceInfo AMPERSAND_AMPERSAND_INFO = const PrecedenceInfo( | |
| 254 '&&', 'AMPERSAND_AMPERSAND', 6, AMPERSAND_AMPERSAND_TOKEN, | |
| 255 isOperator: true); | 217 isOperator: true); |
| 256 | 218 |
| 257 const PrecedenceInfo BAR_INFO = const PrecedenceInfo('|', 'BAR', 9, BAR_TOKEN, | 219 const PrecedenceInfo AMPERSAND_AMPERSAND_INFO = const PrecedenceInfo('&&', |
| 220 'AMPERSAND_AMPERSAND', LOGICAL_AND_PRECEDENCE, AMPERSAND_AMPERSAND_TOKEN, |
| 221 isOperator: true); |
| 222 |
| 223 const PrecedenceInfo BAR_INFO = const PrecedenceInfo( |
| 224 '|', 'BAR', BITWISE_OR_PRECEDENCE, BAR_TOKEN, |
| 258 isOperator: true, isUserDefinableOperator: true); | 225 isOperator: true, isUserDefinableOperator: true); |
| 259 | 226 |
| 260 const PrecedenceInfo CARET_INFO = const PrecedenceInfo( | 227 const PrecedenceInfo CARET_INFO = const PrecedenceInfo( |
| 261 '^', 'CARET', 10, CARET_TOKEN, | 228 '^', 'CARET', BITWISE_XOR_PRECEDENCE, CARET_TOKEN, |
| 262 isOperator: true, isUserDefinableOperator: true); | 229 isOperator: true, isUserDefinableOperator: true); |
| 263 | 230 |
| 264 const PrecedenceInfo AMPERSAND_INFO = const PrecedenceInfo( | 231 const PrecedenceInfo AMPERSAND_INFO = const PrecedenceInfo( |
| 265 '&', 'AMPERSAND', 11, AMPERSAND_TOKEN, | 232 '&', 'AMPERSAND', BITWISE_AND_PRECEDENCE, AMPERSAND_TOKEN, |
| 266 isOperator: true, isUserDefinableOperator: true); | 233 isOperator: true, isUserDefinableOperator: true); |
| 267 | 234 |
| 268 // Equality operators. | 235 // Equality operators. |
| 269 const int EQUALITY_PRECEDENCE = 7; | |
| 270 const PrecedenceInfo BANG_EQ_EQ_INFO = const PrecedenceInfo( | 236 const PrecedenceInfo BANG_EQ_EQ_INFO = const PrecedenceInfo( |
| 271 '!==', 'BANG_EQ_EQ', EQUALITY_PRECEDENCE, BANG_EQ_EQ_TOKEN); | 237 '!==', 'BANG_EQ_EQ', EQUALITY_PRECEDENCE, BANG_EQ_EQ_TOKEN); |
| 272 const PrecedenceInfo BANG_EQ_INFO = const PrecedenceInfo( | 238 const PrecedenceInfo BANG_EQ_INFO = const PrecedenceInfo( |
| 273 '!=', 'BANG_EQ', EQUALITY_PRECEDENCE, BANG_EQ_TOKEN, | 239 '!=', 'BANG_EQ', EQUALITY_PRECEDENCE, BANG_EQ_TOKEN, |
| 274 isOperator: true); | 240 isOperator: true); |
| 275 const PrecedenceInfo EQ_EQ_EQ_INFO = const PrecedenceInfo( | 241 const PrecedenceInfo EQ_EQ_EQ_INFO = const PrecedenceInfo( |
| 276 '===', 'EQ_EQ_EQ', EQUALITY_PRECEDENCE, EQ_EQ_EQ_TOKEN); | 242 '===', 'EQ_EQ_EQ', EQUALITY_PRECEDENCE, EQ_EQ_EQ_TOKEN); |
| 277 const PrecedenceInfo EQ_EQ_INFO = const PrecedenceInfo( | 243 const PrecedenceInfo EQ_EQ_INFO = const PrecedenceInfo( |
| 278 '==', 'EQ_EQ', EQUALITY_PRECEDENCE, EQ_EQ_TOKEN, | 244 '==', 'EQ_EQ', EQUALITY_PRECEDENCE, EQ_EQ_TOKEN, |
| 279 isOperator: true, isUserDefinableOperator: true); | 245 isOperator: true, isUserDefinableOperator: true); |
| 280 | 246 |
| 281 // Relational operators. | 247 // Relational operators. |
| 282 const int RELATIONAL_PRECEDENCE = 8; | |
| 283 const PrecedenceInfo GT_EQ_INFO = const PrecedenceInfo( | 248 const PrecedenceInfo GT_EQ_INFO = const PrecedenceInfo( |
| 284 '>=', 'GT_EQ', RELATIONAL_PRECEDENCE, GT_EQ_TOKEN, | 249 '>=', 'GT_EQ', RELATIONAL_PRECEDENCE, GT_EQ_TOKEN, |
| 285 isOperator: true, isUserDefinableOperator: true); | 250 isOperator: true, isUserDefinableOperator: true); |
| 286 const PrecedenceInfo GT_INFO = const PrecedenceInfo( | 251 const PrecedenceInfo GT_INFO = const PrecedenceInfo( |
| 287 '>', 'GT', RELATIONAL_PRECEDENCE, GT_TOKEN, | 252 '>', 'GT', RELATIONAL_PRECEDENCE, GT_TOKEN, |
| 288 isOperator: true, isUserDefinableOperator: true); | 253 isOperator: true, isUserDefinableOperator: true); |
| 289 const PrecedenceInfo IS_INFO = | 254 const PrecedenceInfo IS_INFO = |
| 290 const PrecedenceInfo('is', 'IS', RELATIONAL_PRECEDENCE, KEYWORD_TOKEN); | 255 const PrecedenceInfo('is', 'IS', RELATIONAL_PRECEDENCE, KEYWORD_TOKEN); |
| 291 const PrecedenceInfo AS_INFO = | 256 const PrecedenceInfo AS_INFO = |
| 292 const PrecedenceInfo('as', 'AS', RELATIONAL_PRECEDENCE, KEYWORD_TOKEN); | 257 const PrecedenceInfo('as', 'AS', RELATIONAL_PRECEDENCE, KEYWORD_TOKEN); |
| 293 const PrecedenceInfo LT_EQ_INFO = const PrecedenceInfo( | 258 const PrecedenceInfo LT_EQ_INFO = const PrecedenceInfo( |
| 294 '<=', 'LT_EQ', RELATIONAL_PRECEDENCE, LT_EQ_TOKEN, | 259 '<=', 'LT_EQ', RELATIONAL_PRECEDENCE, LT_EQ_TOKEN, |
| 295 isOperator: true, isUserDefinableOperator: true); | 260 isOperator: true, isUserDefinableOperator: true); |
| 296 const PrecedenceInfo LT_INFO = const PrecedenceInfo( | 261 const PrecedenceInfo LT_INFO = const PrecedenceInfo( |
| 297 '<', 'LT', RELATIONAL_PRECEDENCE, LT_TOKEN, | 262 '<', 'LT', RELATIONAL_PRECEDENCE, LT_TOKEN, |
| 298 isOperator: true, isUserDefinableOperator: true); | 263 isOperator: true, isUserDefinableOperator: true); |
| 299 | 264 |
| 300 // Shift operators. | 265 // Shift operators. |
| 301 const int SHIFT_PRECEDENCE = 12; | |
| 302 const PrecedenceInfo GT_GT_INFO = const PrecedenceInfo( | 266 const PrecedenceInfo GT_GT_INFO = const PrecedenceInfo( |
| 303 '>>', 'GT_GT', SHIFT_PRECEDENCE, GT_GT_TOKEN, | 267 '>>', 'GT_GT', SHIFT_PRECEDENCE, GT_GT_TOKEN, |
| 304 isOperator: true, isUserDefinableOperator: true); | 268 isOperator: true, isUserDefinableOperator: true); |
| 305 const PrecedenceInfo LT_LT_INFO = const PrecedenceInfo( | 269 const PrecedenceInfo LT_LT_INFO = const PrecedenceInfo( |
| 306 '<<', 'LT_LT', SHIFT_PRECEDENCE, LT_LT_TOKEN, | 270 '<<', 'LT_LT', SHIFT_PRECEDENCE, LT_LT_TOKEN, |
| 307 isOperator: true, isUserDefinableOperator: true); | 271 isOperator: true, isUserDefinableOperator: true); |
| 308 | 272 |
| 309 // Additive operators. | 273 // Additive operators. |
| 310 const int ADDITIVE_PRECEDENCE = 13; | |
| 311 const PrecedenceInfo MINUS_INFO = const PrecedenceInfo( | 274 const PrecedenceInfo MINUS_INFO = const PrecedenceInfo( |
| 312 '-', 'MINUS', ADDITIVE_PRECEDENCE, MINUS_TOKEN, | 275 '-', 'MINUS', ADDITIVE_PRECEDENCE, MINUS_TOKEN, |
| 313 isOperator: true, isUserDefinableOperator: true); | 276 isOperator: true, isUserDefinableOperator: true); |
| 314 const PrecedenceInfo PLUS_INFO = const PrecedenceInfo( | 277 const PrecedenceInfo PLUS_INFO = const PrecedenceInfo( |
| 315 '+', 'PLUS', ADDITIVE_PRECEDENCE, PLUS_TOKEN, | 278 '+', 'PLUS', ADDITIVE_PRECEDENCE, PLUS_TOKEN, |
| 316 isOperator: true, isUserDefinableOperator: true); | 279 isOperator: true, isUserDefinableOperator: true); |
| 317 | 280 |
| 318 // Multiplicative operators. | 281 // Multiplicative operators. |
| 319 const int MULTIPLICATIVE_PRECEDENCE = 14; | |
| 320 const PrecedenceInfo PERCENT_INFO = const PrecedenceInfo( | 282 const PrecedenceInfo PERCENT_INFO = const PrecedenceInfo( |
| 321 '%', 'PERCENT', MULTIPLICATIVE_PRECEDENCE, PERCENT_TOKEN, | 283 '%', 'PERCENT', MULTIPLICATIVE_PRECEDENCE, PERCENT_TOKEN, |
| 322 isOperator: true, isUserDefinableOperator: true); | 284 isOperator: true, isUserDefinableOperator: true); |
| 323 const PrecedenceInfo SLASH_INFO = const PrecedenceInfo( | 285 const PrecedenceInfo SLASH_INFO = const PrecedenceInfo( |
| 324 '/', 'SLASH', MULTIPLICATIVE_PRECEDENCE, SLASH_TOKEN, | 286 '/', 'SLASH', MULTIPLICATIVE_PRECEDENCE, SLASH_TOKEN, |
| 325 isOperator: true, isUserDefinableOperator: true); | 287 isOperator: true, isUserDefinableOperator: true); |
| 326 const PrecedenceInfo STAR_INFO = const PrecedenceInfo( | 288 const PrecedenceInfo STAR_INFO = const PrecedenceInfo( |
| 327 '*', 'STAR', MULTIPLICATIVE_PRECEDENCE, STAR_TOKEN, | 289 '*', 'STAR', MULTIPLICATIVE_PRECEDENCE, STAR_TOKEN, |
| 328 isOperator: true, isUserDefinableOperator: true); | 290 isOperator: true, isUserDefinableOperator: true); |
| 329 const PrecedenceInfo TILDE_SLASH_INFO = const PrecedenceInfo( | 291 const PrecedenceInfo TILDE_SLASH_INFO = const PrecedenceInfo( |
| 330 '~/', 'TILDE_SLASH', MULTIPLICATIVE_PRECEDENCE, TILDE_SLASH_TOKEN, | 292 '~/', 'TILDE_SLASH', MULTIPLICATIVE_PRECEDENCE, TILDE_SLASH_TOKEN, |
| 331 isOperator: true, isUserDefinableOperator: true); | 293 isOperator: true, isUserDefinableOperator: true); |
| 332 | 294 |
| 333 const int POSTFIX_PRECEDENCE = 16; | |
| 334 const PrecedenceInfo PERIOD_INFO = | 295 const PrecedenceInfo PERIOD_INFO = |
| 335 const PrecedenceInfo('.', 'PERIOD', POSTFIX_PRECEDENCE, PERIOD_TOKEN); | 296 const PrecedenceInfo('.', 'PERIOD', POSTFIX_PRECEDENCE, PERIOD_TOKEN); |
| 336 const PrecedenceInfo QUESTION_PERIOD_INFO = const PrecedenceInfo( | 297 const PrecedenceInfo QUESTION_PERIOD_INFO = const PrecedenceInfo( |
| 337 '?.', 'QUESTION_PERIOD', POSTFIX_PRECEDENCE, QUESTION_PERIOD_TOKEN, | 298 '?.', 'QUESTION_PERIOD', POSTFIX_PRECEDENCE, QUESTION_PERIOD_TOKEN, |
| 338 isOperator: true); | 299 isOperator: true); |
| 339 | 300 |
| 340 const PrecedenceInfo KEYWORD_INFO = | 301 const PrecedenceInfo KEYWORD_INFO = |
| 341 const PrecedenceInfo('keyword', 'KEYWORD', 0, KEYWORD_TOKEN); | 302 const PrecedenceInfo('keyword', 'KEYWORD', NO_PRECEDENCE, KEYWORD_TOKEN); |
| 342 | 303 |
| 343 const PrecedenceInfo EOF_INFO = const PrecedenceInfo('', 'EOF', 0, EOF_TOKEN); | 304 const PrecedenceInfo EOF_INFO = |
| 305 const PrecedenceInfo('', 'EOF', NO_PRECEDENCE, EOF_TOKEN); |
| 344 | 306 |
| 345 /// Precedence info used by synthetic tokens that are created during parser | 307 /// Precedence info used by synthetic tokens that are created during parser |
| 346 /// recovery (non-analyzer use case). | 308 /// recovery (non-analyzer use case). |
| 347 const PrecedenceInfo RECOVERY_INFO = | 309 const PrecedenceInfo RECOVERY_INFO = |
| 348 const PrecedenceInfo('recovery', 'RECOVERY', 0, RECOVERY_TOKEN); | 310 const PrecedenceInfo('recovery', 'RECOVERY', NO_PRECEDENCE, RECOVERY_TOKEN); |
| 349 | 311 |
| 350 const PrecedenceInfo IDENTIFIER_INFO = | 312 const PrecedenceInfo IDENTIFIER_INFO = const PrecedenceInfo( |
| 351 const PrecedenceInfo('identifier', 'STRING_INT', 0, IDENTIFIER_TOKEN); | 313 'identifier', 'STRING_INT', NO_PRECEDENCE, IDENTIFIER_TOKEN); |
| 352 | 314 |
| 353 const PrecedenceInfo SCRIPT_INFO = | 315 const PrecedenceInfo SCRIPT_INFO = |
| 354 const PrecedenceInfo('script', 'SCRIPT_TAG', 0, SCRIPT_TOKEN); | 316 const PrecedenceInfo('script', 'SCRIPT_TAG', NO_PRECEDENCE, SCRIPT_TOKEN); |
| 355 | 317 |
| 356 const PrecedenceInfo BAD_INPUT_INFO = | 318 const PrecedenceInfo BAD_INPUT_INFO = const PrecedenceInfo( |
| 357 const PrecedenceInfo('malformed input', 'BAD_INPUT', 0, BAD_INPUT_TOKEN); | 319 'malformed input', 'BAD_INPUT', NO_PRECEDENCE, BAD_INPUT_TOKEN); |
| 358 | 320 |
| 359 const PrecedenceInfo OPEN_PAREN_INFO = const PrecedenceInfo( | 321 const PrecedenceInfo OPEN_PAREN_INFO = const PrecedenceInfo( |
| 360 '(', 'OPEN_PAREN', POSTFIX_PRECEDENCE, OPEN_PAREN_TOKEN); | 322 '(', 'OPEN_PAREN', POSTFIX_PRECEDENCE, OPEN_PAREN_TOKEN); |
| 361 | 323 |
| 362 const PrecedenceInfo CLOSE_PAREN_INFO = | 324 const PrecedenceInfo CLOSE_PAREN_INFO = |
| 363 const PrecedenceInfo(')', 'CLOSE_PAREN', 0, CLOSE_PAREN_TOKEN); | 325 const PrecedenceInfo(')', 'CLOSE_PAREN', NO_PRECEDENCE, CLOSE_PAREN_TOKEN); |
| 364 | 326 |
| 365 const PrecedenceInfo OPEN_CURLY_BRACKET_INFO = const PrecedenceInfo( | 327 const PrecedenceInfo OPEN_CURLY_BRACKET_INFO = const PrecedenceInfo( |
| 366 '{', 'OPEN_CURLY_BRACKET', 0, OPEN_CURLY_BRACKET_TOKEN); | 328 '{', 'OPEN_CURLY_BRACKET', NO_PRECEDENCE, OPEN_CURLY_BRACKET_TOKEN); |
| 367 | 329 |
| 368 const PrecedenceInfo CLOSE_CURLY_BRACKET_INFO = const PrecedenceInfo( | 330 const PrecedenceInfo CLOSE_CURLY_BRACKET_INFO = const PrecedenceInfo( |
| 369 '}', 'CLOSE_CURLY_BRACKET', 0, CLOSE_CURLY_BRACKET_TOKEN); | 331 '}', 'CLOSE_CURLY_BRACKET', NO_PRECEDENCE, CLOSE_CURLY_BRACKET_TOKEN); |
| 370 | 332 |
| 371 const PrecedenceInfo INT_INFO = | 333 const PrecedenceInfo INT_INFO = |
| 372 const PrecedenceInfo('int', 'INT', 0, INT_TOKEN); | 334 const PrecedenceInfo('int', 'INT', NO_PRECEDENCE, INT_TOKEN); |
| 373 | 335 |
| 374 const PrecedenceInfo STRING_INFO = | 336 const PrecedenceInfo STRING_INFO = |
| 375 const PrecedenceInfo('string', 'STRING', 0, STRING_TOKEN); | 337 const PrecedenceInfo('string', 'STRING', NO_PRECEDENCE, STRING_TOKEN); |
| 376 | 338 |
| 377 const PrecedenceInfo OPEN_SQUARE_BRACKET_INFO = const PrecedenceInfo( | 339 const PrecedenceInfo OPEN_SQUARE_BRACKET_INFO = const PrecedenceInfo( |
| 378 '[', 'OPEN_SQUARE_BRACKET', POSTFIX_PRECEDENCE, OPEN_SQUARE_BRACKET_TOKEN); | 340 '[', 'OPEN_SQUARE_BRACKET', POSTFIX_PRECEDENCE, OPEN_SQUARE_BRACKET_TOKEN); |
| 379 | 341 |
| 380 const PrecedenceInfo CLOSE_SQUARE_BRACKET_INFO = const PrecedenceInfo( | 342 const PrecedenceInfo CLOSE_SQUARE_BRACKET_INFO = const PrecedenceInfo( |
| 381 ']', 'CLOSE_SQUARE_BRACKET', 0, CLOSE_SQUARE_BRACKET_TOKEN); | 343 ']', 'CLOSE_SQUARE_BRACKET', NO_PRECEDENCE, CLOSE_SQUARE_BRACKET_TOKEN); |
| 382 | 344 |
| 383 const PrecedenceInfo DOUBLE_INFO = | 345 const PrecedenceInfo DOUBLE_INFO = |
| 384 const PrecedenceInfo('double', 'DOUBLE', 0, DOUBLE_TOKEN); | 346 const PrecedenceInfo('double', 'DOUBLE', NO_PRECEDENCE, DOUBLE_TOKEN); |
| 385 | 347 |
| 386 const PrecedenceInfo STRING_INTERPOLATION_INFO = const PrecedenceInfo( | 348 const PrecedenceInfo STRING_INTERPOLATION_INFO = const PrecedenceInfo( |
| 387 '\${', 'STRING_INTERPOLATION_EXPRESSION', 0, STRING_INTERPOLATION_TOKEN); | 349 '\${', |
| 350 'STRING_INTERPOLATION_EXPRESSION', |
| 351 NO_PRECEDENCE, |
| 352 STRING_INTERPOLATION_TOKEN); |
| 388 | 353 |
| 389 const PrecedenceInfo STRING_INTERPOLATION_IDENTIFIER_INFO = | 354 const PrecedenceInfo STRING_INTERPOLATION_IDENTIFIER_INFO = |
| 390 const PrecedenceInfo('\$', 'STRING_INTERPOLATION_IDENTIFIER', 0, | 355 const PrecedenceInfo('\$', 'STRING_INTERPOLATION_IDENTIFIER', NO_PRECEDENCE, |
| 391 STRING_INTERPOLATION_IDENTIFIER_TOKEN); | 356 STRING_INTERPOLATION_IDENTIFIER_TOKEN); |
| 392 | 357 |
| 393 const PrecedenceInfo HEXADECIMAL_INFO = | 358 const PrecedenceInfo HEXADECIMAL_INFO = const PrecedenceInfo( |
| 394 const PrecedenceInfo('hexadecimal', 'HEXADECIMAL', 0, HEXADECIMAL_TOKEN); | 359 'hexadecimal', 'HEXADECIMAL', NO_PRECEDENCE, HEXADECIMAL_TOKEN); |
| 395 | 360 |
| 396 const PrecedenceInfo SINGLE_LINE_COMMENT_INFO = | 361 const PrecedenceInfo SINGLE_LINE_COMMENT_INFO = const PrecedenceInfo( |
| 397 const PrecedenceInfo('comment', 'SINGLE_LINE_COMMENT', 0, COMMENT_TOKEN); | 362 'comment', 'SINGLE_LINE_COMMENT', NO_PRECEDENCE, COMMENT_TOKEN); |
| 398 | 363 |
| 399 const PrecedenceInfo MULTI_LINE_COMMENT_INFO = | 364 const PrecedenceInfo MULTI_LINE_COMMENT_INFO = const PrecedenceInfo( |
| 400 const PrecedenceInfo('comment', 'MULTI_LINE_COMMENT', 0, COMMENT_TOKEN); | 365 'comment', 'MULTI_LINE_COMMENT', NO_PRECEDENCE, COMMENT_TOKEN); |
| 401 | 366 |
| 402 const PrecedenceInfo GENERIC_METHOD_TYPE_ASSIGN = const PrecedenceInfo( | 367 const PrecedenceInfo GENERIC_METHOD_TYPE_ASSIGN = const PrecedenceInfo( |
| 403 'generic_comment_assign', | 368 'generic_comment_assign', |
| 404 'GENERIC_METHOD_TYPE_ASSIGN', | 369 'GENERIC_METHOD_TYPE_ASSIGN', |
| 405 0, | 370 NO_PRECEDENCE, |
| 406 GENERIC_METHOD_TYPE_ASSIGN_TOKEN); | 371 GENERIC_METHOD_TYPE_ASSIGN_TOKEN); |
| 407 | 372 |
| 408 const PrecedenceInfo GENERIC_METHOD_TYPE_LIST = const PrecedenceInfo( | 373 const PrecedenceInfo GENERIC_METHOD_TYPE_LIST = const PrecedenceInfo( |
| 409 'generic_comment_list', | 374 'generic_comment_list', |
| 410 'GENERIC_METHOD_TYPE_LIST', | 375 'GENERIC_METHOD_TYPE_LIST', |
| 411 0, | 376 NO_PRECEDENCE, |
| 412 GENERIC_METHOD_TYPE_LIST_TOKEN); | 377 GENERIC_METHOD_TYPE_LIST_TOKEN); |
| OLD | NEW |