Node () { TextMateWeigh.Priority priority = TextMateWeigh.Priority.NORMAL; TextMateSelectorToken token = getToken(); if (token instanceof TextMateSelectorLexer.PriorityToken) { advance(); priority = ((TextMateSelectorLexer.PriorityToken)token).getPriority(); } boolean startMatch = false; if (getToken() == TextMateSelectorToken.HAT) { advance(); startMatch = true; } List<Node> children = new ArrayList<>(); List<Node> exclusions = new ArrayList<>(); Node next = parseSelector(); while (next != null) { children.add(next); next = parseSelector(); } while (getToken() == TextMateSelectorToken.MINUS) { advance(); Node exclusion = parseScopeSelector(); if (exclusion != null) { exclusions.add(exclusion); } } if (children.isEmpty() && exclusions.isEmpty()) { return null; } return new ScopeSelector(children, exclusions, startMatch, priority); }