From 740c5a4c13e98bd04b385eee9b881e53eb88d3b8 Mon Sep 17 00:00:00 2001 From: Adrien Hopkins Date: Mon, 26 Aug 2019 16:52:11 -0400 Subject: The unit file parser now uses regular expressions. --- .settings/org.eclipse.jdt.core.prefs | 2 ++ CHANGELOG.org | 20 +++++++++++------ src/org/unitConverter/UnitsDatabase.java | 26 +++++++++++++++++----- .../converterGUI/DelegateListModel.java | 0 .../converterGUI/FilterComparator.java | 0 .../unitConverter/converterGUI/GridBagBuilder.java | 0 .../converterGUI/UnitConverterGUI.java | 0 src/org/unitConverter/dimension/BaseDimension.java | 0 .../dimension/OtherBaseDimension.java | 0 .../unitConverter/dimension/SIBaseDimension.java | 0 .../dimension/StandardDimensions.java | 0 src/org/unitConverter/dimension/UnitDimension.java | 0 src/org/unitConverter/dimension/package-info.java | 0 src/org/unitConverter/unit/BaseUnit.java | 0 src/org/unitConverter/unit/DefaultUnitPrefix.java | 0 src/org/unitConverter/unit/NonlinearUnits.java | 0 src/org/unitConverter/unit/SIPrefix.java | 0 src/org/unitConverter/unit/Unit.java | 0 src/org/unitConverter/unit/UnitPrefix.java | 0 src/org/unitConverter/unit/UnitSystem.java | 0 src/test/java/UnitDimensionTest.java | 0 src/test/java/UnitTest.java | 0 unitsfile.txt | 0 23 files changed, 36 insertions(+), 12 deletions(-) mode change 100755 => 100644 src/org/unitConverter/UnitsDatabase.java mode change 100755 => 100644 src/org/unitConverter/converterGUI/DelegateListModel.java mode change 100755 => 100644 src/org/unitConverter/converterGUI/FilterComparator.java mode change 100755 => 100644 src/org/unitConverter/converterGUI/GridBagBuilder.java mode change 100755 => 100644 src/org/unitConverter/converterGUI/UnitConverterGUI.java mode change 100755 => 100644 src/org/unitConverter/dimension/BaseDimension.java mode change 100755 => 100644 src/org/unitConverter/dimension/OtherBaseDimension.java mode change 100755 => 100644 src/org/unitConverter/dimension/SIBaseDimension.java mode change 100755 => 100644 src/org/unitConverter/dimension/StandardDimensions.java mode change 100755 => 100644 src/org/unitConverter/dimension/UnitDimension.java mode change 100755 => 100644 src/org/unitConverter/dimension/package-info.java mode change 100755 => 100644 src/org/unitConverter/unit/BaseUnit.java mode change 100755 => 100644 src/org/unitConverter/unit/DefaultUnitPrefix.java mode change 100755 => 100644 src/org/unitConverter/unit/NonlinearUnits.java mode change 100755 => 100644 src/org/unitConverter/unit/SIPrefix.java mode change 100755 => 100644 src/org/unitConverter/unit/Unit.java mode change 100755 => 100644 src/org/unitConverter/unit/UnitPrefix.java mode change 100755 => 100644 src/org/unitConverter/unit/UnitSystem.java mode change 100755 => 100644 src/test/java/UnitDimensionTest.java mode change 100755 => 100644 src/test/java/UnitTest.java mode change 100755 => 100644 unitsfile.txt diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs index 8445b6b..db24ee7 100644 --- a/.settings/org.eclipse.jdt.core.prefs +++ b/.settings/org.eclipse.jdt.core.prefs @@ -7,7 +7,9 @@ org.eclipse.jdt.core.compiler.debug.lineNumber=generate org.eclipse.jdt.core.compiler.debug.localVariable=generate org.eclipse.jdt.core.compiler.debug.sourceFile=generate org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled org.eclipse.jdt.core.compiler.problem.enumIdentifier=error org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=ignore org.eclipse.jdt.core.compiler.release=disabled org.eclipse.jdt.core.compiler.source=1.8 diff --git a/CHANGELOG.org b/CHANGELOG.org index 77e7593..1a49709 100644 --- a/CHANGELOG.org +++ b/CHANGELOG.org @@ -1,7 +1,20 @@ * Changelog All notable changes in this project will be shown in this file. +** Unreleased +*** Added + - Added a simple unit conversion method to the Unit interface + - Added a static factory to create nonlinear units to the Unit interface +*** Changed + - You can now use tabs or spaces to separate unit names and their definitions in unit files. ** v0.2.0 - [2019-04-14] +*** Added + - A selection-based unit converter which allows you to select two units, input a value, and convert. + - The UnitDatabase now stores dimensions. + - A system to parse mathematical expressions, used to parse unit expressions. + - You can now add and subtract in unit expressions! + - Instructions for obtaining unit instances are provided in the relevant classes + - The UnitPrefix interface now provides default times, dividedBy and toExponent methods. *** Changed - When searching for units, units with no prefixes are searched for before prefixed units - Smaller prefixes are searched for before larger prefixes @@ -10,13 +23,6 @@ All notable changes in this project will be shown in this file. - BaseUnit is now a subclass of LinearUnit - In unit files, Comments can now start in the middle of lines - UnitsDatabase.addAllFromFile() has been renamed to loadUnitsFile() -*** Added - - A selection-based unit converter which allows you to select two units, input a value, and convert. - - The UnitDatabase now stores dimensions. - - A system to parse mathematical expressions, used to parse unit expressions. - - You can now add and subtract in unit expressions! - - Instructions for obtaining unit instances are provided in the relevant classes - - The UnitPrefix interface now provides default times, dividedBy and toExponent methods. ** v0.1.0 - [2019-02-01] NOTE: At this stage, the API is subject to significant change. *** Added diff --git a/src/org/unitConverter/UnitsDatabase.java b/src/org/unitConverter/UnitsDatabase.java old mode 100755 new mode 100644 index 37d53d4..dcc98df --- a/src/org/unitConverter/UnitsDatabase.java +++ b/src/org/unitConverter/UnitsDatabase.java @@ -36,6 +36,8 @@ import java.util.Set; import java.util.function.BiFunction; import java.util.function.Function; import java.util.function.Predicate; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import org.unitConverter.dimension.UnitDimension; import org.unitConverter.math.DecimalComparison; @@ -971,6 +973,11 @@ public final class UnitsDatabase { } } + /** + * A regular expression that separates names and expressions in unit files. + */ + private static final Pattern NAME_EXPRESSION = Pattern.compile("(\\S+)\\s+(\\S.*)"); + /** * The exponent operator * @@ -1200,13 +1207,22 @@ public final class UnitsDatabase { } // divide line into name and expression - final String[] parts = line.split("\t"); - if (parts.length < 2) + final Matcher lineMatcher = NAME_EXPRESSION.matcher(line); + if (!lineMatcher.matches()) throw new IllegalArgumentException(String.format( - "Lines must consist of a unit name and its definition, separated by tab(s) (line %d).", + "Error at line %d: Lines of a unit file must consist of a unit name, then spaces or tabs, then a unit expression.", lineCounter)); - final String name = parts[0]; - final String expression = parts[parts.length - 1]; + final String name = lineMatcher.group(1); + final String expression = lineMatcher.group(2); + + // divide line into name and expression + // final String[] parts = line.split("\t"); + // if (parts.length < 2) + // throw new IllegalArgumentException(String.format( + // "Lines must consist of a unit name and its definition, separated by tab(s) (line %d).", + // lineCounter)); + // final String name = parts[0]; + // final String expression = parts[parts.length - 1]; if (name.endsWith(" ")) { System.err.printf("Warning - line %d's unit name ends in a space", lineCounter); diff --git a/src/org/unitConverter/converterGUI/DelegateListModel.java b/src/org/unitConverter/converterGUI/DelegateListModel.java old mode 100755 new mode 100644 diff --git a/src/org/unitConverter/converterGUI/FilterComparator.java b/src/org/unitConverter/converterGUI/FilterComparator.java old mode 100755 new mode 100644 diff --git a/src/org/unitConverter/converterGUI/GridBagBuilder.java b/src/org/unitConverter/converterGUI/GridBagBuilder.java old mode 100755 new mode 100644 diff --git a/src/org/unitConverter/converterGUI/UnitConverterGUI.java b/src/org/unitConverter/converterGUI/UnitConverterGUI.java old mode 100755 new mode 100644 diff --git a/src/org/unitConverter/dimension/BaseDimension.java b/src/org/unitConverter/dimension/BaseDimension.java old mode 100755 new mode 100644 diff --git a/src/org/unitConverter/dimension/OtherBaseDimension.java b/src/org/unitConverter/dimension/OtherBaseDimension.java old mode 100755 new mode 100644 diff --git a/src/org/unitConverter/dimension/SIBaseDimension.java b/src/org/unitConverter/dimension/SIBaseDimension.java old mode 100755 new mode 100644 diff --git a/src/org/unitConverter/dimension/StandardDimensions.java b/src/org/unitConverter/dimension/StandardDimensions.java old mode 100755 new mode 100644 diff --git a/src/org/unitConverter/dimension/UnitDimension.java b/src/org/unitConverter/dimension/UnitDimension.java old mode 100755 new mode 100644 diff --git a/src/org/unitConverter/dimension/package-info.java b/src/org/unitConverter/dimension/package-info.java old mode 100755 new mode 100644 diff --git a/src/org/unitConverter/unit/BaseUnit.java b/src/org/unitConverter/unit/BaseUnit.java old mode 100755 new mode 100644 diff --git a/src/org/unitConverter/unit/DefaultUnitPrefix.java b/src/org/unitConverter/unit/DefaultUnitPrefix.java old mode 100755 new mode 100644 diff --git a/src/org/unitConverter/unit/NonlinearUnits.java b/src/org/unitConverter/unit/NonlinearUnits.java old mode 100755 new mode 100644 diff --git a/src/org/unitConverter/unit/SIPrefix.java b/src/org/unitConverter/unit/SIPrefix.java old mode 100755 new mode 100644 diff --git a/src/org/unitConverter/unit/Unit.java b/src/org/unitConverter/unit/Unit.java old mode 100755 new mode 100644 diff --git a/src/org/unitConverter/unit/UnitPrefix.java b/src/org/unitConverter/unit/UnitPrefix.java old mode 100755 new mode 100644 diff --git a/src/org/unitConverter/unit/UnitSystem.java b/src/org/unitConverter/unit/UnitSystem.java old mode 100755 new mode 100644 diff --git a/src/test/java/UnitDimensionTest.java b/src/test/java/UnitDimensionTest.java old mode 100755 new mode 100644 diff --git a/src/test/java/UnitTest.java b/src/test/java/UnitTest.java old mode 100755 new mode 100644 diff --git a/unitsfile.txt b/unitsfile.txt old mode 100755 new mode 100644 -- cgit v1.2.3