public class Parser extends Object
This fairly basic parser uses recursive descent with the following grammar,
where '*' can in fact be either '*', '×', '.', or '·', '/' can be either
'/' or '⁄' and '^' can be either '^', "**" or implicit with switch to superscripts,
and fraction are either unicode fractions like ½ or ⅞ or the decimal value 0.5.
The special cases "n/a" returns a null list. It is intended to manage the
special unit Unit.NONE
.
unit ::= "n/a" | chain chain ::= operand { ('*' | '/') operand } operand ::= integer | integer term | term term ::= '√' base | base power power ::= '^' exponent | ε exponent ::= 'fraction' | integer | '(' integer denominator ')' denominator ::= '/' integer | ε base ::= identifier | '(' chain ')'
This parses correctly units like MHz, km/√d, kg.m.s⁻¹, µas^⅖/(h**(2)×m)³, km/√(kg.s), √kg*km** (3/2) /(µs^2*Ω⁻⁷), km**0.5/s, #/y, 2rev/d², 1/s.
Note that we don't accept combining square roots and power on the same operand; km/√d³ is refused (but km/√(d³) is accepted). We also accept a single integer prefix and only at the start of the specification.
Modifier and Type | Method and Description |
---|---|
static List<PowerTerm> |
buildTermsList(String unitsSpecification)
Build the list of terms corresponding to a units specification.
|
Copyright © 2002-2021 CS GROUP. All rights reserved.