在 ANTLR 中,我有一个具有以下定义的 MismatchedTokenException
:
type : IDENTIFIER ('<' (type (',' type)*) '>')?;
以及以下测试:
A<B,C<D>>
解析第一个>
时发生异常。 ANTLR 尝试同时解析两个“>>”,但失败了。
使用静默空白 channel ,以下测试确实有效:
A<B,C<D> >
其中明确指示 ANTLR 单独处理每个标记。
我该如何解决这个问题?
最佳答案
我无法重现这一点。解析器生成:
grammar T;
type : IDENTIFIER ('<' (type (',' type)*) '>')?;
IDENTIFIER : 'A'..'Z';
解析输入A<B,C<D>>
(不带空格)进入以下解析树:
您需要提供使该输入产生 MismatchedTokenException
的语法。 .
也许您正在使用 ANTLRWorks 的解释器(或 Eclipse 的 ANTLR-IDE,它使用相同的解释器)?在这种情况下,这可能就是问题所在:众所周知,它是有缺陷的。不要使用它,而是使用 ANTLRWorks 的调试器:它很棒(上面发布的图像来自调试器)。
Lazlo Bonin wrote:
Got it. I had a << token defined. Quickly, is there a way to priorize token recognition over another?
不,词法分析器只是尝试尽可能多地匹配。那么如果它可以创建一个匹配 <<
的 token (或 >>
),它将这样做有利于两个单个 <
(或 >
) token 。仅当两个(或多个)词法分析器规则匹配相同数量的字符时,才会进行优先级排序:首先定义的规则将“胜过”语法中稍后定义的规则。
关于antlr - 不匹配的双 token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10374040/