带逗号重复的 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
,至少要对这些备选方案制定单独的规则。
我发现自己经常执行以下操作,因为允许一个条目用逗号分隔:
( 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
,至少要对这些备选方案制定单独的规则。