我有一个看起来像JSON的DSL,我需要支持元素的可选排序。例如:
{
'id': 'someid',
'position' : 'someposition',
'operand' : 'someoperand'
}
为了支持任何“ID'”,“'位置'”和'操作数'的排序。有效逗号的令牌,我必须做这样的事情:
Block returns Block:
{Block}
'{'
members+=BlockMember (',' members+=BlockMember)*
'}'
;
BlockMember returns BlockMember:
blockId=BlockId | position=BlockPosition | operand=Operand
;
问题是每个元素(id,position,operand)都是强制性的,也只是一次。有了这个语法,我有一些问题:
我知道如果我强制执行特定订单并查找逗号,我可以执行此操作。然而,我想要做的是在(不包括最后一个)之间使用逗号之间的可选顺序而不引入一个'成员'这会产生上面列出的问题。
有没有技术可以做到这一点?