Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

WPL Group 逻辑

WPL 的 seqoptaltsome_ofnot 都是分组语义,不是字段类型。

Group 类型

seq - 顺序匹配

(digit:id, chars:name, ip:addr)
seq(digit:id, chars:name, ip:addr)

要求所有字段按顺序成功匹配。

opt - 可选分组

opt(chars:tag")

整个分组可以不存在,失败时不影响规则继续匹配。

alt - 择一分组

alt(ip:addr, chars:addr)

依次尝试候选项,命中第一个成功的分组。

some_of - 重复候选分组

some_of(kvarr, ip, digit)

持续尝试候选项,直到没有任何候选还能继续匹配。

not - 负向断言分组

not(peek_symbol(ERROR):check)

内部字段不匹配时,not(...) 才成功。

关键规则

  • 这些写法都作用在分组层。
  • 如果某段内容可选,先把它拆成独立分组,再用 opt(...) 包起来。
  • 当前语法不支持分组嵌套,例如 opt(alt(...))

正确示例:

(ip:client_ip, digit:status),
opt(chars:tag")

错误示例:

(ip:client_ip, opt(chars:tag"))
opt(alt(ip:addr, chars:domain))

输入消费

  • not(symbol(...)) 是否消费输入,取决于内部 parser 的行为。
  • not(peek_symbol(...)) 更适合做不消费输入的前瞻判断。