具有“$”的ANTLR异常处理,Java [英] ANTLR exception handling with "$", Java

查看:208
本文介绍了具有“$”的ANTLR异常处理,Java的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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

/ *如果有错误引发异常消息* /
parser.program();

/ *如果有错误找到多少,如果0,则打印成功,* /
int errorsCount = parser.getNumberOfSyntaxErrors();
if(errorsCount == 0){
System.out.println(parsing successful);
}

getNumberofSyntaxErrors在我的情况下为错误的输入返回大于0的数字。对于int i;,输出只是;

 解析成功
/ pre>

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

 行1:4没有可行的替代字符'$'/ *这是我期待看到的* / 
解析成功/ *这不是我期望看到的* /


解决方案

可能的词法分析器(或解析器)尝试从(次要)错误中恢复,并继续进行标记化或解析。如果您希望在出现某些非法字符时终止,最简单的方法是创建一些堕落规则,该规则放置在所有词法分析器规则的末尾,如果上述任何词法分析器规则都匹配,则会匹配,以及让这个规则抛出一个例外:

 语法T; 

//解析器规则

// lexer规则

/ *最后一个lexer规则* /
FALL_THROUGH
:。 {throw new RuntimeException(Illegal character:+ getText());}
;


For my grammar in ANTLR, my java code can catch and print errors for inputs containing "$". In my implementation, I need to print out "success" for successful input. So, I do following in my java code,

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 returns numbers greater than 0 for wrong inputs in my case. For "int i;", the output is just;

parsing successful 

When I run my code for a input like int $i;, java code prints out error message with "parsing successful" because getNumberofSyntaxErrors() returns 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*/

解决方案

Possibly the lexer (or parser) tries to recover from (minor) errors and continues tokenizing or parsing. If you want to terminate whenever some illegal character occurs, the easiest is to create some sort of "fall-through" rule that is placed at the end of all your lexer rules which will match if none of the lexer rules above have matched, and let that rule throw an exception:

grammar T;

// parser rules

// lexer rules

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

这篇关于具有“$”的ANTLR异常处理,Java的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆