Antlr4,如何报告特定的语法错误(Antlr4, How to report specific

2019-10-18 16:22发布

我试图用antlr4写一些错误检查我的语法简单。

语法本身是由功能构造的。

FUNCTION hello (n){
    ......
}
FUNCTION main (n) {
    ......
}

我不知道它是如何想捕获特定的错误,如缺少函数名 ,或丢失的主要功能

这里是我的ErrorListener样子

import org.antlr.v4.runtime.*;
import org.antlr.v4.runtime.tree.*;

public class SimpleErrorListener extends BaseErrorListener {
    @Override
    public void syntaxError(Recognizer<?, ?> recognizer,
            Object offendingSymbol,
            int line,
            int charPositionInLine,
            String msg,
            RecognitionException e) {
        List<String> stack = ((Parser) recognizer.getRuleInvocationStack();
        Collections.reverse(stack);
        System.err.println("rule stack: " + stack);
        System.err.println("line" + line + ":" + 
            charPositionInLine + "at" + offendingSymbol + ": " + msg);
    }
}

我也删除了控制台错误监听,并添加这一个,但我不知道该如何处理这些特定错误。 任何建议表示赞赏。 非常感谢。

Answer 1:

报告语义错误通常比报告的语法错误要容易得多。 如果你想语法错误的自定义报表,你需要改变你的语法所以那些语法错误成为语义错误。 例如,如果你目前解析你的函数是这样的:

function : FUNCTION ID '(' ...

然后,你可以把通过以下规则,而不是一个“缺少函数名”成语法错误:

function : FUNCTION ID? '(' ...

// alternate
function : FUNCTION (ID | /*missing function name; reported in listener*/) '(' ...

请注意,你的语法将很快变得无法管理你添加越来越多的特殊情况。



文章来源: Antlr4, How to report specific syntax error