由于歧义导致的antlr4词法分析器/解析器冲突

时间:2015-11-29 23:49:14

标签: antlr4

我正在尝试解析MS的SQL方言。根据规范,'top'必须在其表达式周围括号

从...

中选择顶部(@rows * 2) a,b,c

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

从......

中选择前75名 a,b,c

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

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

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

问题是,1)我可以强制它匹配作为没有谓词的词法分析器规则和2)最重要的是,我应该吗?

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

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

1 个答案:

答案 0 :(得分:0)

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

我建议您始终将文字定义为词法分析器规则(解析器规则中没有'TOP',没有数字)并保持top_clause不变,只需使用新的词法分析器规则(以及小的重构):

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

top_clause: TOP (DIGITS | OPEN_PAR expression CLOSE_PAR);