Skip to main content

3. Operators (运算符)

3.1. Concatenation (连接): Rule1 Rule2

由空格分隔的规则值的简单顺序称为连接。

foo = bar baz

因此,规则<foo>匹配<bar>后跟<baz>的字符串。

3.2. Alternatives (备选项): Rule1 / Rule2

正斜杠("/")分隔的元素是备选项。

foo = bar / baz

因此,规则<foo>将接受<bar><baz>

3.3. Incremental Alternatives (增量备选项): Rule1 =/ Rule2

有时方便地指定一组备选项的列表以片段形式指定。也就是说,初始规则可以匹配一个或多个备选项,稍后的规则定义将添加到备选项集中。这对于具有独立规范的标准的替代方案特别有用,例如通常单独发布的MIME媒体类型(RFC 2045等)。

ruleset  = alt1 / alt2 / alt3 / alt4 / alt5

等同于:

ruleset  = alt1 / alt2
ruleset =/ alt3
ruleset =/ alt4 / alt5

3.4. Value Range Alternatives (值范围备选项): %c##-##

可以通过短线("-")指定替代数字值的范围。

DIGIT = %x30-39

等同于:

DIGIT = "0" / "1" / "2" / "3" / "4" / "5" / "6" / "7" / "8" / "9"

3.5. Sequence Group (序列组): (Rule1 Rule2)

用括号括起来的元素被视为单个元素,其内容是严格有序的。

elem = (foo / bar) blat

匹配:foo blatbar blat

elem = foo / bar blat

匹配:foobar blat

建议: 使用分组和/或适当的空白来使规则清晰易读。

3.6. Variable Repetition (可变重复): *Rule

元素前面的星号("*")表示重复。完整形式是:

<a>*<b>element

其中<a><b>是可选的十进制值,表示元素至少出现<a>次,最多出现<b>次。

默认值:

  • *element: 零次或多次 (等同于 0*)
  • 1*element: 一次或多次
  • 3*3element: 恰好3次 (等同于 3element)
  • 1*2element: 一次或两次
  • *2element: 零次、一次或两次

3.7. Specific Repetition (特定重复): nRule

可以使用以下形式指定特定重复次数:

<n>element

等同于:

<n>*<n>element

因此:

2DIGIT = DIGIT DIGIT
3ALPHA = ALPHA ALPHA ALPHA

3.8. Optional Sequence (可选序列): [RULE]

方括号括起来的元素是可选的(等同于*1RULE)。

[foo bar]

等同于:

*1(foo bar)

即,可选地出现一次foo bar

3.9. Comment (注释): ; Comment

注释以分号开始,并继续到行尾。这是供人类使用者阅读的简单方法。

rulename = element ; 这是一个注释

3.10. Operator Precedence (运算符优先级)

上述各种机制具有以下优先级(从最紧密绑定到最松散绑定):

  1. 规则名称、组、可选
  2. 重复
  3. 连接
  4. 备选项

使用分组运算符可以自由地更改优先级。

示例:

foo = %x61       ; 单个字符 'a'
bar = %x62 ; 单个字符 'b'
mumble = foo / bar ; 'a' 或 'b'
bumble = foo bar ; 'ab'
cycle = foo [bar] ; 'a' 或 'ab'
pattern = 1*2(foo bar) ; 'ab' 或 'abab'