所以我有以下SQL表达式编辑器的语法规则(简化):
FUNCTIONID: 'sum' | 'avg';
functionExpr: FUNCTIONID '(' expr ')'
AGGFUNCTIONID: 'sum' | 'avg'
aggFunctionExpr: AGGFUNCTIONID '(' expr ')' 'over' ...
该代码适用于诸如"sum(1)over…"之类的表达式,但不适用于没有over
的情况。
我怎么能让这个语法同时适用于这两种情况,并且仍然有这两条规则?
'sum
'和'avg'
将始终标记为FUNCTIONID
,这是没有办法的。有关解释,请参阅:语法分析器/lexer规则的Antlr v3错误
你可以这样做:
aggFunctionExpr
: aggFunctionId '(' expr ')' 'over' ...
;
functionExpr
: functionId '(' expr ')'
;
functionId : SUM | AVG;
aggFunctionId : SUM | AVG;
SUM : 'sum';
AVG : 'avg';
...