From 77fd6f4be166c230ecb7419a8a14892707c922e1 Mon Sep 17 00:00:00 2001 From: Zafar Khaja Date: Wed, 5 Feb 2014 15:07:20 +0400 Subject: [PATCH] Refactor pre-release and build parsing, simplify --- .../zafarkhaja/semver/VersionParser.java | 74 ++++++++++++------- 1 file changed, 48 insertions(+), 26 deletions(-) diff --git a/src/main/java/com/github/zafarkhaja/semver/VersionParser.java b/src/main/java/com/github/zafarkhaja/semver/VersionParser.java index cdb64be..5347a19 100644 --- a/src/main/java/com/github/zafarkhaja/semver/VersionParser.java +++ b/src/main/java/com/github/zafarkhaja/semver/VersionParser.java @@ -298,9 +298,6 @@ class VersionParser implements Parser { * * ::= * | "." - * - * ::= - * | * } * * @@ -309,23 +306,37 @@ class VersionParser implements Parser { */ private MetadataVersion parsePreRelease() { List idents = new ArrayList(); - CharType end = nearestCharType(PLUS, EOL); - CharType before = nearestCharType(DOT, end); do { checkForEmptyIdentifier(); - if (chars.positiveLookaheadBefore(before, LETTER, HYPHEN)) { - idents.add(alphanumericIdentifier()); - } else { - idents.add(numericIdentifier()); - } - if (before == DOT) { + idents.add(preReleaseIdentifier()); + if (chars.positiveLookahead(DOT)) { chars.consume(DOT); - before = nearestCharType(DOT, end); } - } while (!chars.positiveLookahead(end)); + } while (!chars.positiveLookahead(PLUS, EOL)); return new MetadataVersion(idents.toArray(new String[idents.size()])); } + /** + * Parses the {@literal } non-terminal. + * + *
+     * {@literal
+     *  ::= 
+     *                            | 
+     * }
+     * 
+ * + * @return a single pre-release identifier + */ + private String preReleaseIdentifier() { + CharType boundary = nearestCharType(DOT, PLUS, EOL); + if (chars.positiveLookaheadBefore(boundary, LETTER, HYPHEN)) { + return alphanumericIdentifier(); + } else { + return numericIdentifier(); + } + } + /** * Parses the {@literal } non-terminal. * @@ -335,9 +346,6 @@ class VersionParser implements Parser { * * ::= * | "." - * - * ::= - * | * } * * @@ -346,23 +354,37 @@ class VersionParser implements Parser { */ private MetadataVersion parseBuild() { List idents = new ArrayList(); - CharType end = EOL; - CharType before = nearestCharType(DOT, end); do { checkForEmptyIdentifier(); - if (chars.positiveLookaheadBefore(before, LETTER, HYPHEN)) { - idents.add(alphanumericIdentifier()); - } else { - idents.add(digits()); - } - if (before == DOT) { + idents.add(buildIdentifier()); + if (chars.positiveLookahead(DOT)) { chars.consume(DOT); - before = nearestCharType(DOT, end); } - } while (!chars.positiveLookahead(end)); + } while (!chars.positiveLookahead(EOL)); return new MetadataVersion(idents.toArray(new String[idents.size()])); } + /** + * Parses the {@literal } non-terminal. + * + *
+     * {@literal
+     *  ::= 
+     *                      | 
+     * }
+     * 
+ * + * @return a single build identifier + */ + private String buildIdentifier() { + CharType boundary = nearestCharType(DOT, EOL); + if (chars.positiveLookaheadBefore(boundary, LETTER, HYPHEN)) { + return alphanumericIdentifier(); + } else { + return digits(); + } + } + /** * Parses the {@literal } non-terminal. *