summaryrefslogtreecommitdiff
path: root/dice-lang/src/bjc/dicelang/DoubleMatcher.java
diff options
context:
space:
mode:
authorbjculkin <bjculkin@WIT-136XG42.wvu-ad.wvu.edu>2017-03-01 10:13:41 -0500
committerbjculkin <bjculkin@WIT-136XG42.wvu-ad.wvu.edu>2017-03-01 10:13:41 -0500
commit36e0911c6ec27707a74f0b90b1052a16374243ea (patch)
tree08ca7723b0c0a6a7f3ce1830c59e5211e46168b8 /dice-lang/src/bjc/dicelang/DoubleMatcher.java
parent6ed83507953322c35a456d64d89f8f4f9cb0a6a1 (diff)
Package reorganization
Diffstat (limited to 'dice-lang/src/bjc/dicelang/DoubleMatcher.java')
-rw-r--r--dice-lang/src/bjc/dicelang/DoubleMatcher.java58
1 files changed, 58 insertions, 0 deletions
diff --git a/dice-lang/src/bjc/dicelang/DoubleMatcher.java b/dice-lang/src/bjc/dicelang/DoubleMatcher.java
new file mode 100644
index 0000000..75df9c7
--- /dev/null
+++ b/dice-lang/src/bjc/dicelang/DoubleMatcher.java
@@ -0,0 +1,58 @@
+package bjc.dicelang;
+
+import java.util.regex.Pattern;
+
+/**
+ * Checks if a string would pass Double.parseDouble.
+ *
+ * Uses a regex from the javadoc for Double.valueOf()
+ */
+public class DoubleMatcher {
+ private static final String Digits =
+ "(\\p{Digit}+)";
+ private static final String HexDigits =
+ "(\\p{XDigit}+)";
+
+ // an exponent is 'e' or 'E' followed by an optionally
+ // signed decimal integer.
+ private static final String Exp =
+ "[eE][+-]?" + Digits;
+
+ private static final String fpRegex =
+ ("[\\x00-\\x20]*" +
+ // Optional leading "whitespace"
+ "[+-]?(" + // Optional sign character
+ "NaN|" + // "NaN" string
+ "Infinity|" + // "Infinity" string
+
+ // A decimal floating-point string representing a finite positive
+ // number without a leading sign has at most five basic pieces:
+ // Digits . Digits ExponentPart FloatTypeSuffix
+ //
+ // Since this method allows integer-only strings as input
+ // in addition to strings of floating-point literals, the
+ // two sub-patterns below are simplifications of the grammar
+ // productions from section 3.10.2 of
+ // The Java™ Language Specification.
+
+ // Digits ._opt Digits_opt ExponentPart_opt FloatTypeSuffix_opt
+ "((("+Digits+"(\\.)?("+Digits+"?)("+Exp+")?)|"+
+
+ // . Digits ExponentPart_opt FloatTypeSuffix_opt
+ "(\\.("+Digits+")("+Exp+")?)|"+
+
+ // Hexadecimal strings
+ "((" +
+ // 0[xX] HexDigits ._opt BinaryExponent FloatTypeSuffix_opt
+ "(0[xX]" + HexDigits + "(\\.)?)|" +
+
+ // 0[xX] HexDigits_opt . HexDigits BinaryExponent FloatTypeSuffix_opt
+ "(0[xX]" + HexDigits + "?(\\.)" + HexDigits + ")" +
+
+ ")[pP][+-]?" + Digits + "))" +
+ "[fFdD]?))" +
+ "[\\x00-\\x20]*");// Optional trailing "whitespace"
+
+ public static final Pattern floatingLiteral = Pattern.compile("\\A" + fpRegex + "\\Z");
+
+}