MCPcopy Create free account
hub / github.com/brimdata/super / parseRuleRecursiveLeader

Method parseRuleRecursiveLeader

compiler/parser/parser.go:25184–25226  ·  view source on GitHub ↗
(rule *rule)

Source from the content-addressed store, hash-verified

25182}
25183
25184func (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
25228func (p *parser) parseRuleRecursiveNoLeader(rule *rule) (any, bool) {
25229 return p.parseRule(rule)

Callers 1

parseRuleWrapMethod · 0.95

Calls 10

getMemoizedMethod · 0.95
restoreMethod · 0.95
outMethod · 0.95
inMethod · 0.95
cloneStateMethod · 0.95
setMemoizedMethod · 0.95
parseRuleMethod · 0.95
printIndentMethod · 0.95
sliceFromMethod · 0.95
restoreStateMethod · 0.95

Tested by

no test coverage detected