()
| 124 | } |
| 125 | |
| 126 | Evaluator parseSimpleSequence() { |
| 127 | // SimpleSequence ::= TypeSelector? ( Hash | Class | Pseudo )* |
| 128 | Evaluator left = null; |
| 129 | tq.consumeWhitespace(); |
| 130 | |
| 131 | // one optional type selector |
| 132 | if (tq.matchesWord() || tq.matches("*|")) |
| 133 | left = byTag(); |
| 134 | else if (tq.matchChomp('*')) |
| 135 | left = new Evaluator.AllElements(); |
| 136 | |
| 137 | // zero or more subclasses (#, ., [) |
| 138 | while(true) { |
| 139 | Evaluator right = parseSubclass(); |
| 140 | if (right != null) { |
| 141 | left = and(left, right); |
| 142 | } |
| 143 | else break; // no more simple tokens |
| 144 | } |
| 145 | |
| 146 | if (left == null) |
| 147 | throw new Selector.SelectorParseException("Could not parse query '%s': unexpected token at '%s'", query, tq.remainder()); |
| 148 | return left; |
| 149 | } |
| 150 | |
| 151 | static Evaluator combinator(Evaluator left, char combinator, Evaluator right) { |
| 152 | switch (combinator) { |
no test coverage detected