如何用EBNF表示shape至少一次、attr可零次且顺序不限?
EBNF语法规则实现方案
要满足shape至少出现一次、attr可出现零次或多次且二者顺序不限,但排除仅含attr的情况,你可以用以下两种简洁的EBNF写法实现:
写法一:核心确保至少一个shape
这种写法通过明确嵌入一个shape来保证序列中至少存在一个,前后允许任意数量的shape或attr(包括零个):
# 定义单个元素可以是shape或attr element = shape | attr ; # 有效序列:任意元素* + 至少一个shape + 任意元素* valid_sequence = element*, shape, element* ;
写法二:拆分场景明确约束
如果想更直观区分不同开头的场景,也可以拆分为两种情况:
element = shape | attr ; # 有效序列分为两种: # 1. 以shape开头,后面跟任意数量的元素 # 2. 以一个或多个attr开头,随后必须跟至少一个shape,再跟任意数量的元素 valid_sequence = (shape, element*) | (attr+, shape, element*) ;
验证规则有效性
这两种写法都能正确匹配你给出的所有合法示例:
shape1 shape2 shape3:匹配写法一的element*(空) +shape1+element*(shape2 shape3);或写法二的第一种场景attr1 shape1:匹配写法一的element*(attr1) +shape1+element*(空);或写法二的第二种场景shape1 attr1:匹配写法一的element*(空) +shape1+element*(attr1);或写法二的第一种场景shape1 shape2 attr1 shape3:匹配写法一的element*(空) +shape1+element*(shape2 attr1 shape3);或写法二的第一种场景
而仅含attr的序列(如attr1 attr2)无法匹配任何规则:写法一中找不到必须存在的shape;写法二中既不符合以shape开头,也没有在attr+之后出现shape,因此会被拒绝解析。
内容的提问来源于stack exchange,提问作者judep
相关产品推荐
相关产品推荐

