2

在 ANTLR 中,我有MismatchedTokenException以下定义:

type : IDENTIFIER ('<' (type (',' type)*) '>')?;

以及以下测试:

A<B,C<D>>

解析第一个时发生异常>。ANTLR 尝试同时解析两个“>>”,但失败了。

使用静默空白通道,以下测试确实有效:

A<B,C<D> >

其中明确指示 ANTLR 分别处理每个令牌。

我该如何解决?

4

1 回答 1

2

我无法重现。解析器生成:

grammar T;

type       : IDENTIFIER ('<' (type (',' type)*) '>')?;
IDENTIFIER : 'A'..'Z';

将输入A<B,C<D>>(不带空格)解析为以下解析树:

在此处输入图像描述

您需要提供导致此输入生成MismatchedTokenException.

也许您正在使用 ANTLRWorks 的解释器(或 Eclipse 的 ANTLR-IDE,它使用相同的解释器)?在那种情况下,可能就是问题所在:臭名昭著的越野车。不要使用它,而是使用 ANTLRWorks 的调试器:它很棒(上面发布的图像来自调试器)。

拉兹洛博宁写道:

知道了。我定义了一个 << 令牌。很快,有没有办法让令牌识别优先于另一个?

不,词法分析器只是尝试尽可能多地匹配。因此,如果它可以创建一个标记匹配<<(or >>),它将支持两个单个<(or >) 标记。只有当两个(或更多)词法分析器规则匹配相同数量的字符时,才会进行优先级排序:首先定义的规则将“胜过”稍后在语法中定义的规则。

于 2012-04-29T17:08:51.313 回答