wp-lang 0.2.1

WPL language crate with AST, parser, evaluator, builtins, and generators.
Documentation
# WPL Group 逻辑

WPL 的 `seq`、`opt`、`alt`、`some_of`、`not` 都是分组语义,不是字段类型。

## Group 类型

### seq - 顺序匹配

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

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

### opt - 可选分组

```wpl
opt(chars:tag")
```

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

### alt - 择一分组

```wpl
alt(ip:addr, chars:addr)
```

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

### some_of - 重复候选分组

```wpl
some_of(kvarr, ip, digit)
```

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

### not - 负向断言分组

```wpl
not(peek_symbol(ERROR):check)
```

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

## 关键规则

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

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

错误示例:

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

## 输入消费

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