我有一个语法,其中一个语言语句(流语句之外(由<expression>;
组成。目前,当ANTLR解析并找到丢失的;
时,它会在下一个令牌的位置将其标识为丢失,这通常意味着下一行的开始。这并不理想,因为在这种情况下,更正确的说法是,它在前一个令牌的末尾丢失,而不是在下一个令牌开始时丢失。
有没有一种方法可以指示ANTLR将上一个令牌的末尾指示为错误的位置,而不是下一个令牌开始的位置?我理解解析器为什么会这样看,但对于一个人来说,这可能有点令人困惑(尤其是对于可能正在学习该语言的新手程序员来说(。我在一个GUI编辑器项目中使用它是为了给程序员一个更好的工具,所以我也想提供一条更好的错误消息(因为目标是提供更好的开发和学习体验(。
我正在使用一个自定义的IAntlrErrorListener<IToken>
实现来收集错误,以便在重要的情况下显示给程序员。我希望有一种简单的方法可以在解析器规则级别指示这一点,这样解析器就可以很容易地被指示将前一个令牌的末尾指示为问题位置,而不是下一个令牌。
创建侦听器时,可以获得对令牌流的引用。从报告错误的令牌中,您可以获得usegetTokenIndex()
,然后从中减去1,并使用令牌流的get()
方法来获得上一个令牌。
注意:它可能不会那么简单,因为可能有多个令牌和/或skip
ped令牌,您必须对其进行说明才能获得您真正想要使用的令牌。因此,虽然您可以获取流中的其他令牌,但获取错误消息所需的前一个令牌可能会很"麻烦"。(这可能就是为什么ANTLR会给你这样的参考(