有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

使用“$”处理ANTLR异常,Java

对于我在ANTLR中的语法,我的java代码可以捕获并打印包含“$”的输入的错误。在我的实现中,我需要打印“success”以获得成功的输入。因此,我在java代码中执行以下操作:

CharStream charStream = new ANTLRFileStream(filePath);
myLexer lexer = new myLexer(charStream);
TokenStream tokens = new CommonTokenStream(lexer);
myParser parser = new myParser(tokens);

/*if there is an error throws an exception message*/
parser.program(); 

/*if there is an error find how many, if 0 then print success,*/
int errorsCount = parser.getNumberOfSyntaxErrors();
if(errorsCount == 0){
  System.out.println("parsing successful");
}

getNumberofSyntaxErrors在我的案例中,对于错误的输入返回大于0的数字。对于“int i;”,输出是公正的

parsing successful 

当我为int$I;,这样的输入运行代码时;,java代码输出错误消息“解析成功”,因为getNumberofSyntaxErrors()返回0

line 1:4 no viable alternative at character '$' /*this is what I expect to see*/
parsing successful /*this is not what i expect to see*/

共 (1) 个答案

  1. # 1 楼答案

    词法分析器(或解析器)可能会尝试从(轻微)错误中恢复,并继续标记化或解析。如果您想在出现非法字符时终止,最简单的方法是创建某种“失败”规则,放置在所有lexer规则的末尾,如果上面的lexer规则都不匹配,则该规则将匹配,并让该规则引发异常:

    grammar T;
    
    // parser rules
    
    // lexer rules
    
    /* last lexer rules */
    FALL_THROUGH
      :  .  {throw new RuntimeException("Illegal character: " + getText());}
      ;