| Index: dart/frog/leg/tools/mini_parser.dart
|
| diff --git a/dart/frog/leg/tools/mini_parser.dart b/dart/frog/leg/tools/mini_parser.dart
|
| index 7f6c4997e431b698427feb025d56379d3368b3a6..85096e68344974d4a78476f702bd58406a586726 100644
|
| --- a/dart/frog/leg/tools/mini_parser.dart
|
| +++ b/dart/frog/leg/tools/mini_parser.dart
|
| @@ -19,51 +19,87 @@ void main() {
|
| stopwatch.start();
|
| List<String> filenames = new Options().arguments;
|
| bool diet = false;
|
| + bool throwOnError = false;
|
| + bool scanOnly = false;
|
| int charCount = 0;
|
| for (String filename in filenames) {
|
| if (filename == "--diet") {
|
| diet = true;
|
| continue;
|
| }
|
| + if (filename == "--throw") {
|
| + throwOnError = true;
|
| + continue;
|
| + }
|
| + if (filename == "--scan-only") {
|
| + scanOnly = true;
|
| + continue;
|
| + }
|
| String source = new String.fromCharCodes(read(filename));
|
| charCount += source.length;
|
| SourceFile file = new SourceFile(filename, source);
|
| Listener listener = new MyListener(file);
|
| Parser parser = diet ? new PartialParser(listener) : new Parser(listener);
|
| try {
|
| - parser.parseUnit(scan(file.text));
|
| + Token token = scan(file);
|
| + if (!scanOnly) parser.parseUnit(token);
|
| } catch (ParserError ex) {
|
| - print(ex);
|
| + if (throwOnError) {
|
| + throw;
|
| + } else {
|
| + print(ex);
|
| + }
|
| }
|
| }
|
| stopwatch.stop();
|
| int kb = (charCount/1024).round().toInt();
|
| String stats =
|
| - '$classCount classes (${kb}Kb) in ${stopwatch.elapsedInMs()}ms.';
|
| + '$classCount classes (${kb}Kb) in ${stopwatch.elapsedInMs()}ms';
|
| + if (errorCount != 0) {
|
| + stats += ' with $errorCount errors';
|
| + }
|
| if (diet) {
|
| - print('Diet parsed $stats');
|
| + print('Diet parsed $stats.');
|
| } else {
|
| - print('Parsed $stats');
|
| + print('Parsed $stats.');
|
| }
|
| }
|
|
|
| -Token scan(String source) => new StringScanner(source).tokenize();
|
| +Token scan(SourceFile source) {
|
| + Scanner scanner = new StringScanner(source.text);
|
| + try {
|
| + return scanner.tokenize();
|
| + } catch (MalformedInputException ex) {
|
| + var message = ex.message;
|
| + if (message is !String) message = "unexpected character";
|
| + Token fakeToken = new Token($QUESTION, scanner.charOffset);
|
| + new MyListener(source).error(message, fakeToken);
|
| + throw;
|
| + }
|
| +}
|
|
|
| List<int> read(String filename) {
|
| File file = new File(filename);
|
| file.openSync();
|
| + bool threw = true;
|
| try {
|
| int size = file.lengthSync();
|
| List<int> bytes = new List<int>(size + 1);
|
| file.readListSync(bytes, 0, size);
|
| bytes[size] = $EOF;
|
| + threw = false;
|
| return bytes;
|
| } finally {
|
| - file.closeSync();
|
| + try {
|
| + file.closeSync();
|
| + } catch (var ex) {
|
| + if (!threw) throw;
|
| + }
|
| }
|
| }
|
|
|
| int classCount = 0;
|
| +int errorCount = 0;
|
|
|
| class MyListener extends Listener {
|
| final SourceFile file;
|
| @@ -75,6 +111,7 @@ class MyListener extends Listener {
|
| }
|
|
|
| void error(String message, Token token) {
|
| + ++errorCount;
|
| if (token !== null) {
|
| String tokenString = token.toString();
|
| int begin = token.charOffset;
|
|
|