ANTLR(v4)任意规则排序

时间:2015-03-13 17:33:17

标签: c# parsing antlr

我正在解析类似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规则。

1 个答案:

答案 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)还是解析器超类中。