2014-10-31 65 views
0

所以我SQL表达式编辑器下面的语法规则(简体)Antlr4语法歧义:两个相同的前缀规则

FUNCTIONID: 'sum' | 'avg'; 
functionExpr: FUNCTIONID '(' expr ')' 

AGGFUNCTIONID: 'sum' | 'avg' 
aggFunctionExpr: AGGFUNCTIONID '(' expr ')' 'over' ... 

的代码适用于诸如“总和(1)在... “但没有时没有over

我怎么能让这个语法适用于这两种情况,仍然有这两个规则?

+0

ANTLR4的词法分析器工作在许多方面一样ANTLR3,这是在这里解释:http://stackoverflow.com/questions/9251048/antlr-v3-error-with-parser-lexer-rules – 2014-10-31 07:47:27

+0

问题在于他们评论了第一条规则获胜,这正是现在正在发生的事情。我希望解析器做的是预测一个'over'令牌,并根据是否有一个令牌来决定。那可能吗? – escanda 2014-10-31 08:27:20

+0

不,这就是我的意思:ANTLR4和ANTLR3在这方面的工作原理是一样的。我会在一个答案中进一步解释。 – 2014-10-31 08:39:39

回答

0

'sum'和'avg'将永远被标记为FUNCTIONID,这是无法绕过它的。有关说明,请参见:Antlr v3 error with parser/lexer rules

你可以做这样的事情:

aggFunctionExpr 
: aggFunctionId '(' expr ')' 'over' ... 
; 

functionExpr 
: functionId '(' expr ')' 
; 

functionId : SUM | AVG; 
aggFunctionId : SUM | AVG; 

SUM : 'sum'; 
AVG : 'avg'; 

... 
+0

你给了我一个正确的提示,把它作为一个函数调用进行标记,并有一个可选的表达式,用于'over'和后面的内容。谢谢 – escanda 2014-10-31 09:56:27

+0

不客气@escanda。 – 2014-10-31 10:05:38

相关问题