Hoist tokenizing RegExps out. R=nweiz@google.com Review URL: https://codereview.chromium.org//1310423004 .
diff --git a/pkgs/yaml/lib/src/loader.dart b/pkgs/yaml/lib/src/loader.dart index d80578f..0792957 100644 --- a/pkgs/yaml/lib/src/loader.dart +++ b/pkgs/yaml/lib/src/loader.dart
@@ -13,6 +13,31 @@ import 'yaml_exception.dart'; import 'yaml_node.dart'; +/// Matches YAML null. +final _nullRegExp = new RegExp(r"^(null|Null|NULL|~|)$"); + +/// Matches a YAML bool. +final _boolRegExp = new RegExp(r"^(?:(true|True|TRUE)|(false|False|FALSE))$"); + +/// Matches a YAML decimal integer like `+1234`. +final _decimalIntRegExp = new RegExp(r"^[-+]?[0-9]+$"); + +/// Matches a YAML octal integer like `0o123`. +final _octalIntRegExp = new RegExp(r"^0o([0-7]+)$"); + +/// Matches a YAML hexidecimal integer like `0x123abc`. +final _hexIntRegExp = new RegExp(r"^0x[0-9a-fA-F]+$"); + +/// Matches a YAML floating point number like `12.34+e56`. +final _floatRegExp = new RegExp( + r"^[-+]?(\.[0-9]+|[0-9]+(\.[0-9]*)?)([eE][-+]?[0-9]+)?$"); + +/// Matches YAML infinity. +final _infinityRegExp = new RegExp(r"^([+-]?)\.(inf|Inf|INF)$"); + +/// Matches YAML NaN. +final _nanRegExp = new RegExp(r"^\.(nan|NaN|NAN)$"); + /// A loader that reads [Event]s emitted by a [Parser] and emits /// [YamlDocument]s. /// @@ -183,9 +208,8 @@ /// Parses a null scalar. YamlScalar _parseNull(ScalarEvent scalar) { - // TODO(nweiz): stop using regexps. // TODO(nweiz): add ScalarStyle and implicit metadata to the scalars. - if (new RegExp(r"^(null|Null|NULL|~|)$").hasMatch(scalar.value)) { + if (_nullRegExp.hasMatch(scalar.value)) { return new YamlScalar.internal(null, scalar.span, scalar.style); } else { return null; @@ -194,8 +218,7 @@ /// Parses a boolean scalar. YamlScalar _parseBool(ScalarEvent scalar) { - var match = new RegExp(r"^(?:(true|True|TRUE)|(false|False|FALSE))$"). - firstMatch(scalar.value); + var match = _boolRegExp.firstMatch(scalar.value); if (match == null) return null; return new YamlScalar.internal( match.group(1) != null, scalar.span, scalar.style); @@ -203,19 +226,19 @@ /// Parses an integer scalar. YamlScalar _parseInt(ScalarEvent scalar) { - var match = new RegExp(r"^[-+]?[0-9]+$").firstMatch(scalar.value); + var match = _decimalIntRegExp.firstMatch(scalar.value); if (match != null) { return new YamlScalar.internal( int.parse(match.group(0)), scalar.span, scalar.style); } - match = new RegExp(r"^0o([0-7]+)$").firstMatch(scalar.value); + match = _octalIntRegExp.firstMatch(scalar.value); if (match != null) { var n = int.parse(match.group(1), radix: 8); return new YamlScalar.internal(n, scalar.span, scalar.style); } - match = new RegExp(r"^0x[0-9a-fA-F]+$").firstMatch(scalar.value); + match = _hexIntRegExp.firstMatch(scalar.value); if (match != null) { return new YamlScalar.internal( int.parse(match.group(0)), scalar.span, scalar.style); @@ -226,9 +249,7 @@ /// Parses a floating-point scalar. YamlScalar _parseFloat(ScalarEvent scalar) { - var match = new RegExp( - r"^[-+]?(\.[0-9]+|[0-9]+(\.[0-9]*)?)([eE][-+]?[0-9]+)?$"). - firstMatch(scalar.value); + var match = _floatRegExp.firstMatch(scalar.value); if (match != null) { // YAML allows floats of the form "0.", but Dart does not. Fix up those // floats by removing the trailing dot. @@ -237,13 +258,13 @@ double.parse(matchStr), scalar.span, scalar.style); } - match = new RegExp(r"^([+-]?)\.(inf|Inf|INF)$").firstMatch(scalar.value); + match = _infinityRegExp.firstMatch(scalar.value); if (match != null) { var value = match.group(1) == "-" ? -double.INFINITY : double.INFINITY; return new YamlScalar.internal(value, scalar.span, scalar.style); } - match = new RegExp(r"^\.(nan|NaN|NAN)$").firstMatch(scalar.value); + match = _nanRegExp.firstMatch(scalar.value); if (match != null) { return new YamlScalar.internal(double.NAN, scalar.span, scalar.style); }