C# ANTLR(v4)任意规则排序

C# ANTLR(v4)任意规则排序,c#,parsing,antlr,C#,Parsing,Antlr,我正在解析一个类似JSON的结构,该结构如下所示: items { item { name : 'Name', value : 'abc', type : String } } item : name ',' value ',' type // I want these to be able to be in any order ; name : NAME ':' Str ; value :

我正在解析一个类似JSON的结构,该结构如下所示:

items {
    item {
        name : 'Name',
        value : 'abc',
        type : String
    }
}
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
    ;
项的解析器规则可能如下所示:

items {
    item {
        name : 'Name',
        value : 'abc',
        type : String
    }
}
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
    ;
我如何编写
规则,使得key:value对的顺序不重要,解析器只检查规则的存在?也就是说,
value
可以位于
name
之前,等等

编辑

我应该澄清,我知道我可以做到这一点:

item
    : item_item*
    ;
item_item
    : name
    | value
    | type
    ;
但问题是,
规则需要将每个规则仅限于一个实例。例如,使用这种技术,我可以得到任意数量的
名称
规则。

天真的暴力方法将是解决语法分析中的问题(避免这种):

这导致了一个大的解析器规范和不可维护的访问者/侦听器代码

更好: 使用简单的解析器规则和语义谓词验证:

item
  : i+=item_item ',' i+=item_item ',' i+=item_item  {containsNVT($i)}?
  ;
item_item
  : name
  | value
  | type
  ;
您可以放置代码来验证所有三个项是否都是内联指定的
containsNVT($i)
inline或在解析器超类中指定的