antlr4 lexer/parser 歧义导致的冲突

antlr4 lexer/parser conflict due to ambiguity

我正在尝试解析 MS 的 SQL 方言。根据规范,'top' 的表达式

必须有方括号

select top (@rows * 2) a, b, c 来自...

但作为例外,如果值是无符号文字整数,则可以省略这些,因此

select 前 75 a、b、c 来自...

我试图在我的解析器中嵌入这个文字-整数特例(松散地):

top_clause : 'TOP' [0-9]+ | 'TOP' '('表达式')' ;

所以第一个选择是纯词法分析器规则,第二个是解析器规则。由于整数常量是有效的表达式,因此它选择将其解析为表达式。

问题是,1) 我可以强制它作为不带谓词的词法分析器规则进行匹配吗?2) 最重要的是,我应该这样做吗?

我的猜测是我不应该 - 这是一个明显的歧义(真的,我的语法错误)我想我应该将它作为一个纯粹的解析器规则来匹配(只是“'TOP' 表达式”)然后整理一下。 欢迎指教。

编辑:根据 Matt Timmermans 的观点进行了修改。

答案取决于您实际想要实现的目标,但我的猜测是您想要允许,例如TOP 和数字之间的空格。如果将其定义为词法分析器规则,则必须在此处明确指定空格。对于解析器规则,这不是必需的,因为(我再次猜测)您有一个跳过空格的词法分析器规则。

我建议您始终将文字定义为词法分析器规则(解析器规则中没有 'TOP',没有数字)并保持 top_clause 原样,只是使用新的词法分析器规则(和一个小的重构):

DIGITS: [0-9]+;
TOP: 'TOP';
OPEN_PAR: '(';
CLOSE_PAR: ')';

top_clause: TOP (DIGITS | OPEN_PAR expression CLOSE_PAR);