| OLD | NEW |
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, 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.parser.listener; | 5 library fasta.parser.listener; |
| 6 | 6 |
| 7 import '../fasta_codes.dart' show FastaMessage; |
| 8 |
| 7 import '../scanner/token.dart' show BeginGroupToken, SymbolToken, Token; | 9 import '../scanner/token.dart' show BeginGroupToken, SymbolToken, Token; |
| 8 | 10 |
| 9 import '../util/link.dart' show Link; | 11 import '../util/link.dart' show Link; |
| 10 | 12 |
| 11 import 'error_kind.dart' show ErrorKind; | |
| 12 import 'package:front_end/src/fasta/scanner/precedence.dart' show RECOVERY_INFO; | 13 import 'package:front_end/src/fasta/scanner/precedence.dart' show RECOVERY_INFO; |
| 13 import 'parser.dart' show FormalParameterType; | 14 import 'parser.dart' show FormalParameterType; |
| 14 | 15 |
| 15 import 'identifier_context.dart' show IdentifierContext; | 16 import 'identifier_context.dart' show IdentifierContext; |
| 16 | 17 |
| 17 /// A parser event listener that does nothing except throw exceptions | 18 /// A parser event listener that does nothing except throw exceptions |
| 18 /// on parser errors. | 19 /// on parser errors. |
| 19 /// | 20 /// |
| 20 /// Events are methods that begin with one of: `begin`, `end`, or `handle`. | 21 /// Events are methods that begin with one of: `begin`, `end`, or `handle`. |
| 21 /// | 22 /// |
| 22 /// Events starting with `begin` and `end` come in pairs. Normally, a | 23 /// Events starting with `begin` and `end` come in pairs. Normally, a |
| 23 /// `beginFoo` event is followed by an `endFoo` event. There's a few exceptions | 24 /// `beginFoo` event is followed by an `endFoo` event. There's a few exceptions |
| 24 /// documented below. | 25 /// documented below. |
| 25 /// | 26 /// |
| 26 /// Events starting with `handle` are used when isn't possible to have a begin | 27 /// Events starting with `handle` are used when isn't possible to have a begin |
| 27 /// event. | 28 /// event. |
| 28 class Listener { | 29 class Listener { |
| 29 final List<ParserError> recoverableErrors = <ParserError>[]; | 30 final List<ParserError> recoverableErrors = <ParserError>[]; |
| 30 | 31 |
| 32 Uri get uri => null; |
| 33 |
| 31 void logEvent(String name) {} | 34 void logEvent(String name) {} |
| 32 | 35 |
| 33 set suppressParseErrors(bool value) {} | 36 set suppressParseErrors(bool value) {} |
| 34 | 37 |
| 35 void beginArguments(Token token) {} | 38 void beginArguments(Token token) {} |
| 36 | 39 |
| 37 void endArguments(int count, Token beginToken, Token endToken) { | 40 void endArguments(int count, Token beginToken, Token endToken) { |
| 38 logEvent("Arguments"); | 41 logEvent("Arguments"); |
| 39 } | 42 } |
| 40 | 43 |
| (...skipping 958 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 999 /// recover, it should return a non-null continuation token whose `next` | 1002 /// recover, it should return a non-null continuation token whose `next` |
| 1000 /// pointer is the token the parser should continue from. Error recovery | 1003 /// pointer is the token the parser should continue from. Error recovery |
| 1001 /// is tightly coupled to the parser implementation, so to recover from an | 1004 /// is tightly coupled to the parser implementation, so to recover from an |
| 1002 /// error, one must carefully examine the code in the parser that generates | 1005 /// error, one must carefully examine the code in the parser that generates |
| 1003 /// the error. | 1006 /// the error. |
| 1004 /// | 1007 /// |
| 1005 /// If the listener can't recover, it can throw an exception or return | 1008 /// If the listener can't recover, it can throw an exception or return |
| 1006 /// `null`. In the latter case, the parser simply skips to EOF which will | 1009 /// `null`. In the latter case, the parser simply skips to EOF which will |
| 1007 /// often result in additional parser errors as the parser returns from its | 1010 /// often result in additional parser errors as the parser returns from its |
| 1008 /// recursive state. | 1011 /// recursive state. |
| 1009 Token handleUnrecoverableError(Token token, ErrorKind kind, Map arguments) { | 1012 Token handleUnrecoverableError(Token token, FastaMessage message) { |
| 1010 throw new ParserError.fromTokens(token, token, kind, arguments); | 1013 throw new ParserError.fromTokens(token, token, message); |
| 1011 } | 1014 } |
| 1012 | 1015 |
| 1013 /// The parser noticed a syntax error, but was able to recover from it. | 1016 /// The parser noticed a syntax error, but was able to recover from it. |
| 1014 void handleRecoverableError(Token token, ErrorKind kind, Map arguments) { | 1017 void handleRecoverableError(Token token, FastaMessage message) { |
| 1015 recoverableErrors | 1018 recoverableErrors.add(new ParserError.fromTokens(token, token, message)); |
| 1016 .add(new ParserError.fromTokens(token, token, kind, arguments)); | |
| 1017 } | 1019 } |
| 1018 | 1020 |
| 1019 void handleScript(Token token) { | 1021 void handleScript(Token token) { |
| 1020 logEvent("Script"); | 1022 logEvent("Script"); |
| 1021 } | 1023 } |
| 1022 | 1024 |
| 1023 /// Creates a new synthetic token whose `next` pointer points to [next]. | 1025 /// Creates a new synthetic token whose `next` pointer points to [next]. |
| 1024 /// | 1026 /// |
| 1025 /// If [next] is `null`, `null` is returned. | 1027 /// If [next] is `null`, `null` is returned. |
| 1026 Token newSyntheticToken(Token next) { | 1028 Token newSyntheticToken(Token next) { |
| 1027 if (next == null) return null; | 1029 if (next == null) return null; |
| 1028 return new SymbolToken(RECOVERY_INFO, next.charOffset)..next = next; | 1030 return new SymbolToken(RECOVERY_INFO, next.charOffset)..next = next; |
| 1029 } | 1031 } |
| 1030 } | 1032 } |
| 1031 | 1033 |
| 1032 class ParserError { | 1034 class ParserError { |
| 1033 /// Character offset from the beginning of file where this error starts. | 1035 /// Character offset from the beginning of file where this error starts. |
| 1034 final int beginOffset; | 1036 final int beginOffset; |
| 1035 | 1037 |
| 1036 /// Character offset from the beginning of file where this error ends. | 1038 /// Character offset from the beginning of file where this error ends. |
| 1037 final int endOffset; | 1039 final int endOffset; |
| 1038 | 1040 |
| 1039 final ErrorKind kind; | 1041 final FastaMessage message; |
| 1040 | 1042 |
| 1041 final Map arguments; | 1043 ParserError(this.beginOffset, this.endOffset, this.message); |
| 1042 | 1044 |
| 1043 ParserError(this.beginOffset, this.endOffset, this.kind, this.arguments); | 1045 ParserError.fromTokens(Token begin, Token end, FastaMessage message) |
| 1046 : this(begin.charOffset, end.charOffset + end.charCount, message); |
| 1044 | 1047 |
| 1045 ParserError.fromTokens(Token begin, Token end, ErrorKind kind, Map arguments) | 1048 String toString() => "@${beginOffset}: ${message.message}\n${message.tip}"; |
| 1046 : this(begin.charOffset, end.charOffset + end.charCount, kind, arguments); | |
| 1047 | |
| 1048 String toString() => "@${beginOffset}: $kind $arguments"; | |
| 1049 } | 1049 } |
| OLD | NEW |