(rule *rule)
| 25182 | } |
| 25183 | |
| 25184 | func (p *parser) parseRuleRecursiveLeader(rule *rule) (any, bool) { |
| 25185 | result, ok := p.getMemoized(rule) |
| 25186 | if ok { |
| 25187 | p.restore(result.end) |
| 25188 | return result.v, result.b |
| 25189 | } |
| 25190 | |
| 25191 | if p.debug { |
| 25192 | defer p.out(p.in("recursive " + rule.name)) |
| 25193 | } |
| 25194 | |
| 25195 | var ( |
| 25196 | depth = 0 |
| 25197 | startMark = p.pt |
| 25198 | lastResult = resultTuple{nil, false, startMark} |
| 25199 | lastErrors = *p.errs |
| 25200 | ) |
| 25201 | |
| 25202 | for { |
| 25203 | lastState := p.cloneState() |
| 25204 | p.setMemoized(startMark, rule, lastResult) |
| 25205 | val, ok := p.parseRule(rule) |
| 25206 | endMark := p.pt |
| 25207 | if p.debug { |
| 25208 | p.printIndent("RECURSIVE", fmt.Sprintf( |
| 25209 | "Rule %s depth %d: %t -> %s", |
| 25210 | rule.name, depth, ok, string(p.sliceFrom(startMark)))) |
| 25211 | } |
| 25212 | if (!ok) || (endMark.offset <= lastResult.end.offset && depth != 0) { |
| 25213 | p.restoreState(lastState) |
| 25214 | *p.errs = lastErrors |
| 25215 | break |
| 25216 | } |
| 25217 | lastResult = resultTuple{val, ok, endMark} |
| 25218 | lastErrors = *p.errs |
| 25219 | p.restore(startMark) |
| 25220 | depth++ |
| 25221 | } |
| 25222 | |
| 25223 | p.restore(lastResult.end) |
| 25224 | p.setMemoized(startMark, rule, lastResult) |
| 25225 | return lastResult.v, lastResult.b |
| 25226 | } |
| 25227 | |
| 25228 | func (p *parser) parseRuleRecursiveNoLeader(rule *rule) (any, bool) { |
| 25229 | return p.parseRule(rule) |
no test coverage detected