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 blat 或 bar blat
elem = foo / bar blat
匹配:foo 或 bar 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 (运算符优先级)
上述各种机制具有以下优先级(从最紧密绑定到最松散绑定):
- 规则名称、组、可选
- 重复
- 连接
- 备选项
使用分组运算符可以自由地更改优先级。
示例:
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'