带逗号重复的 EBNF

EBNF with comma repetition

我发现自己经常执行以下操作,因为允许一个条目用逗号分隔:

( function | expression ) ( ',' ( function | expression ))*

有没有更紧凑的方法来做到这一点?理想情况下,我只是希望能够按照以下方式做一些事情:

( function | expression ) [,...]

或者:

( function | expression ',')*

顺便说一下,我将其用作验证器:https://www.bottlecaps.de/rr/ui#_Production


我正在尝试 'clean up' 的整个语法如下:

AGGREGATION
  ::= 'GROUP BY' ( GROUPING_ROWS | PIVOT )?

PIVOT
  ::= 'PIVOT(' AXIS_EXPR (AXIS_EXPR ',' )? ')'

AXIS_EXPR
  ::= expr ( 'AS'? alias )? 'ON' ( 'ROWS' | 'COLS' ) ( 'HAVING' expr )? ( 'ORDER BY' expr ( 'ASC' | 'DESC' )? )? ( 'LIMIT' num 'PERCENT'? )?

GROUPING_ROWS
  ::= 'GROUPING_ROWS(' GROUPING_EXPR (GROUPING_EXPR ',' )? ')'

GROUPING_EXPR
  ::= NAME_OR_POS 'SUBTOTAL' 'S'? GROUPING_EXPR_SUBTOTAL (',' GROUPING_EXPR_SUBTOTAL)*

GROUPING_EXPR_SUBTOTAL
  ::= NAME_OR_POS ':'  AGGREGATED_CALCULATION ( ',' AGGREGATED_CALCULATION )*

NAME_OR_POS
  ::= ( name | pos )

AGGREGATED_CALCULATION
  ::= ( aggregation_function | aggregation_expression ) ( 'AS'? alias)?

作为我发现自己一直在使用的结构的一个例子:

( function | expression ) ( ',' ( function | expression ))*

Is there a more compact way to do this?

除了像这样引入“辅助规则”之外:

rule
 : atom_list
 ;

atom_list
 : atom (',' atom)*
 ;

atom
 : function
 | expression
 ;

答案是:不,没有更短的方法可以用 ANTLR 将 a (',' a)* 写入 (a ',')* 之类的东西。

如果您经常重复 function | expression,至少要对这些备选方案制定单独的规则。