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