C# ANTLR(v4)任意规则排序
我正在解析一个类似JSON的结构,该结构如下所示: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 :
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或在解析器超类中指定的