1

我正在尝试使用 antlr4 为我的简单语法编写一些错误检查。

语法本身是由函数构造的。

IE

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);
    }
}

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

4

1 回答 1

1

报告语义错误通常比报告语法错误容易得多。如果您想要自定义语法错误报告,则需要更改语法,使这些语法错误成为语义错误。例如,如果您当前像这样解析函数:

function : FUNCTION ID '(' ...

然后,您可以使用以下规则之一将“缺少函数名称”转换为语法错误:

function : FUNCTION ID? '(' ...

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

请注意,随着您添加越来越多的特殊情况,您的语法将很快变得难以管理。

于 2013-09-22T14:59:02.587 回答