package jscl.text; import javax.annotation.Nonnull; import javax.annotation.Nullable; import jscl.math.Generic; public class CompoundIdentifier implements Parser<String> { public static final Parser<String> parser = new CompoundIdentifier(); private CompoundIdentifier() { } @Nonnull public String parse(@Nonnull Parameters p, @Nullable Generic previousSumElement) throws ParseException { int pos0 = p.position.intValue(); final StringBuilder result; ParserUtils.skipWhitespaces(p); try { final String identifier = Identifier.parser.parse(p, previousSumElement); result = new StringBuilder(); result.append(identifier); } catch (ParseException e) { p.position.setValue(pos0); throw e; } while (true) { try { final String dotAndId = DotAndIdentifier.parser.parse(p, previousSumElement); // NOTE: '.' must be appended after parsing result.append(".").append(dotAndId); } catch (ParseException e) { p.exceptionsPool.release(e); break; } } return result.toString(); } } class DotAndIdentifier implements Parser<String> { public static final Parser<String> parser = new DotAndIdentifier(); private DotAndIdentifier() { } public String parse(@Nonnull Parameters p, Generic previousSumElement) throws ParseException { int pos0 = p.position.intValue(); ParserUtils.tryToParse(p, pos0, '.'); String result; try { result = Identifier.parser.parse(p, previousSumElement); } catch (ParseException e) { p.position.setValue(pos0); throw e; } return result; } }