我正在解析类似JSON的结构,如下所示:
items {
item {
name : 'Name',
value : 'abc',
type : String
}
}
item
的解析器规则可能如下所示:
item
: name ',' value ',' type // I want these to be able to be in any order
;
name
: NAME ':' Str
;
value
: VALUE ':' atom
;
type
: TYPE ':' data_type
;
我如何编写item
规则,使得key:value对的顺序不重要,解析器只会检查规则的存在?也就是说,value
可以在name
等之前出现
修改
我应该澄清,我知道我可以这样做:
item
: item_item*
;
item_item
: name
| value
| type
;
但问题是item
规则需要将每个规则限制为只有一个实例。例如,使用这种技术,我可以得到任意数量的name
规则。
答案 0 :(得分:2)
天真的蛮力方法是解决语法分析中的问题(避免这种):
item
: name ',' value ',' type
| name ',' type ',' value
| type ',' name ',' value
| ...
;
这会导致大型解析器规范和不可维护的访问者/侦听器代码。
<强>更好的:强> 使用简单的解析器规则和语义谓词来验证:
item
: i+=item_item ',' i+=item_item ',' i+=item_item {containsNVT($i)}?
;
item_item
: name
| value
| type
;
您可以放置代码以验证所有三个项目是内联指定的containsNVT($i)
还是解析器超类中。