Breaking changes, see CHANGELOG.
Add breaking changes and release 1.0.0.
This makes `.error()` default to empty spans rather than
single-character ones. This better represents the semantics of failing
at a particular position in the text.
It also makes `lastMatch` reset whenever the scanner's position changes.
This makes `.error()` behave more consistently when primarily doing
character-based scanning, since it won't unexpectedly emit an error for
stale match data.
R=jmesserly@google.com
Review URL: https://codereview.chromium.org//2056933002 .
7 files changed
tree: 18599481b474ddb28becfb2888fb3ed6753bc0f3
- lib/
- test/
- .analysis_options
- .gitignore
- .test_config
- CHANGELOG.md
- codereview.settings
- LICENSE
- pubspec.yaml
- README.md
README.md
This package exposes a StringScanner
type that makes it easy to parse a string using a series of Pattern
s. For example:
import 'dart:math';
import 'package:string_scanner/string_scanner.dart';
num parseNumber(String source) {
// Scan a number ("1", "1.5", "-3").
var scanner = new StringScanner(source);
// [Scanner.scan] tries to consume a [Pattern] and returns whether or not it
// succeeded. It will move the scan pointer past the end of the pattern.
var negative = scanner.scan("-");
// [Scanner.expect] consumes a [Pattern] and throws a [FormatError] if it
// fails. Like [Scanner.scan], it will move the scan pointer forward.
scanner.expect(new RegExp(r"\d+"));
// [Scanner.lastMatch] holds the [MatchData] for the most recent call to
// [Scanner.scan], [Scanner.expect], or [Scanner.matches].
var number = int.parse(scanner.lastMatch[0]);
if (scanner.scan(".")) {
scanner.expect(new RegExp(r"\d+"));
var decimal = scanner.lastMatch[0];
number += int.parse(decimal) / math.pow(10, decimal.length);
}
// [Scanner.expectDone] will throw a [FormatError] if there's any input that
// hasn't yet been consumed.
scanner.expectDone();
return (negative ? -1 : 1) * number;
}