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

Unified Diff: pkg/dart_scanner/lib/dart_scanner.dart

Issue 2654433009: Skeleton for lexical error recovery. (Closed)
Patch Set: Address comments. Created 3 years, 11 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | pkg/dart_scanner/lib/src/abstract_scanner.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: pkg/dart_scanner/lib/dart_scanner.dart
diff --git a/pkg/dart_scanner/lib/dart_scanner.dart b/pkg/dart_scanner/lib/dart_scanner.dart
index 7b48626de29a3878bf527ab57761ab6f9e80497a..f9e5374deacc6226d0fe173486627e4ec169007e 100644
--- a/pkg/dart_scanner/lib/dart_scanner.dart
+++ b/pkg/dart_scanner/lib/dart_scanner.dart
@@ -10,6 +10,9 @@ import 'src/token.dart' show
import 'src/utf8_bytes_scanner.dart' show
Utf8BytesScanner;
+import 'src/recover.dart' show
+ defaultRecoveryStrategy;
+
export 'src/token.dart' show
BeginGroupToken,
ErrorToken,
@@ -35,8 +38,14 @@ export 'src/string_scanner.dart' show
export 'src/keyword.dart' show
Keyword;
+typedef Token Recover(List<int> bytes, Token tokens, List<int> lineStarts);
+
abstract class Scanner {
+ /// Returns true if an error occured during [tokenize].
+ bool get hasErrors;
+
List<int> get lineStarts;
+
Token tokenize();
}
@@ -47,11 +56,17 @@ class ScannerResult {
ScannerResult(this.tokens, this.lineStarts);
}
-ScannerResult scan(List<int> bytes, {bool includeComments: false}) {
+ScannerResult scan(List<int> bytes,
+ {bool includeComments: false, Recover recover}) {
if (bytes.last != 0) {
throw new ArgumentError("[bytes]: the last byte must be null.");
}
Scanner scanner =
new Utf8BytesScanner(bytes, includeComments: includeComments);
- return new ScannerResult(scanner.tokenize(), scanner.lineStarts);
+ Token tokens = scanner.tokenize();
+ if (scanner.hasErrors) {
+ recover ??= defaultRecoveryStrategy;
+ tokens = recover(bytes, tokens, scanner.lineStarts);
+ }
+ return new ScannerResult(tokens, scanner.lineStarts);
}
« no previous file with comments | « no previous file | pkg/dart_scanner/lib/src/abstract_scanner.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698