c# - 如果输入无效,是否可以抛出异常?

标签 c# exception antlr4

我有一个简单的 ANLTR 语法和随附的 Visitor。一切正常,除非输入无效。如果输入无效,错误会被吞没,我的计算器会输出错误的结果。

我已经尝试过实现一个错误监听器,覆盖词法分析器的 Recover 方法,以及......好吧......今天有六件其他事情。有人可以告诉我如何简单地抛出错误而不是吞下坏的“ token ”吗? (我使用引号是因为它们根本不是标记。这些字符在我的语法中是未定义的。)

有效输入:

1 + 2 * 3 - 4

无效输入:

1 + 2 + 3(4)

如果解析器/词法分析器遇到括号(或任何其他未定义的字符),我想抛出一个 ArgumentException。目前,无效字符似乎消失得无影无踪,解析器就像没有任何问题一样缓慢前进。

如果我在控制台中使用 grun 命令运行它,我会得到以下输出,因此它在某种程度上识别了无效标记。

line 1:9 token recognition error at: '('

line 1:11 token recognition error at: ')'

以及由此产生的解析树。

enter image description here

基础数学.g4

grammar BasicMath;

/*
 * Parser Rules
 */

compileUnit : expression+ EOF;

expression :
    expression MULTIPLY expression #Multiplication
    | expression DIVIDE expression #Division
    | expression ADD expression #Addition
    | expression SUBTRACT expression #Subtraction
    | NUMBER #Number
    ; 

/*
 * Lexer Rules
 */

NUMBER : INT; //Leave room to extend what kind of math we can do.

INT : ('0'..'9')+;
MULTIPLY : '*';
DIVIDE : '/';
SUBTRACT : '-';
ADD : '+';

WS : [ \t\r\n] -> channel(HIDDEN);

计算器:

public static class Calculator
{
    public static int Evaluate(string expression)
    {
        var lexer = new BasicMathLexer(new AntlrInputStream(expression));
        var tokens = new CommonTokenStream(lexer);
        var parser = new BasicMathParser(tokens);
        
        var tree = parser.compileUnit();

        var visitor = new IntegerMathVisitor();

        return visitor.Visit(tree);
    }
}

最佳答案

其实每条错误信息都是由一个异常引起的。此异常被捕获并且解析器尝试恢复。分析树是恢复的结果。

由于错误发生在词法分析器中(词法分析器只是不知道字符()),所以必须将错误处理附加到词法分析器中。在 Java 中,这看起来像:

    lexer.addErrorListener(new BaseErrorListener()  {
        @Override
        public void syntaxError(Recognizer<?, ?> recognizer, Object offendingSymbol, int line, int charPositionInLine, String msg, RecognitionException e) {
            throw new RuntimeException(e);
        }
    });

C# 语法应该与此相去不远。但我建议不要抛出异常。最好将错误收集到一个列表中,并在词法分析器完成后报告它们,如果错误列表不为空,则不要开始解析。

关于c# - 如果输入无效,是否可以抛出异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29834489/

相关文章:

java - 输入 ANTLR4 没有可行的替代方案

java - 基于 ANTLR4 的词法分析器在 NetBeans 上键入期间丢失语法突出显示

c# - 运算符(operator) ?。和扩展方法

c# - 如何在.NET 中安装 Windows 服务?

c# - MySqlDataAdapter 填充输入字符串格式?

c# - 无法访问文件,因为它正在被另一个进程使用

json - Tkinter 回调 : json. 解码器中出现异常。JSONDecodeError:期望值:第 1 行第 1 列(字符 0)

python - 在Tkinter中设置错误处理循环

来自 Github 的 ANTLR4 和 C# 目标的 Java 语法

c# - 使用 Newtonsoft 在 C# 中迭代​​嵌套的 JSON 数组