在 ANTLR 中,我有MismatchedTokenException
以下定义:
type : IDENTIFIER ('<' (type (',' type)*) '>')?;
以及以下测试:
A<B,C<D>>
解析第一个时发生异常>
。ANTLR 尝试同时解析两个“>>”,但失败了。
使用静默空白通道,以下测试确实有效:
A<B,C<D> >
其中明确指示 ANTLR 分别处理每个令牌。
我该如何解决?
在 ANTLR 中,我有MismatchedTokenException
以下定义:
type : IDENTIFIER ('<' (type (',' type)*) '>')?;
以及以下测试:
A<B,C<D>>
解析第一个时发生异常>
。ANTLR 尝试同时解析两个“>>”,但失败了。
使用静默空白通道,以下测试确实有效:
A<B,C<D> >
其中明确指示 ANTLR 分别处理每个令牌。
我该如何解决?
我无法重现。解析器生成:
grammar T;
type : IDENTIFIER ('<' (type (',' type)*) '>')?;
IDENTIFIER : 'A'..'Z';
将输入A<B,C<D>>
(不带空格)解析为以下解析树:
您需要提供导致此输入生成MismatchedTokenException
.
也许您正在使用 ANTLRWorks 的解释器(或 Eclipse 的 ANTLR-IDE,它使用相同的解释器)?在那种情况下,这可能就是问题所在:臭名昭著的越野车。不要使用它,而是使用 ANTLRWorks 的调试器:它很棒(上面发布的图像来自调试器)。
拉兹洛博宁写道:
知道了。我定义了一个 << 令牌。很快,有没有办法让令牌识别优先于另一个?
不,词法分析器只是尝试尽可能多地匹配。因此,如果它可以创建一个标记匹配<<
(or >>
),它将支持两个单个<
(or >
) 标记。只有当两个(或更多)词法分析器规则匹配相同数量的字符时,才会进行优先级排序:首先定义的规则将“胜过”稍后在语法中定义的规则。