java时间解析错误_java – 中断解析错误与有用的消息

我有一个ANTLR 4语法,并从中构建了一个词法分析器和解析器.现在我试图以这样的方式实例化该解析器,以便它将解析直到它遇到错误.如果遇到错误,则不应继续解析,但应提供有关问题的有用信息;理想地是机器可读位置和人类可读的消息.

这是我现在有的:

grammar Toy;

@parser::members {

public static void main(String[] args) {

for (String arg: args)

System.out.println(arg + " => " + parse(arg));

}

public static String parse(String code) {

ErrorListener errorListener = new ErrorListener();

CharStream cstream = new ANTLRInputStream(code);

ToyLexer lexer = new ToyLexer(cstream);

lexer.removeErrorListeners();

lexer.addErrorListener(errorListener);

TokenStream tstream = new CommonTokenStream(lexer);

ToyParser parser = new ToyParser(tstream);

parser.removeErrorListeners();

parser.addErrorListener(errorListener);

parser.setErrorHandler(new BailErrorStrategy());

try {

String res = parser.top().str;

if (errorListener.message != null)

return "Parsed, but " + errorListener.toString();

return res;

} catch (ParseCancellationException e) {

if (errorListener.message != null)

return "Failed, because " + errorListener.toString();

throw e;

}

}

static class ErrorListener extends BaseErrorListener {

String message = null;

int start = -2, stop = -2, line = -2;

@Override

public void syntaxError(Recognizer, ?> recognizer,

Object offendingSymbol,

int line,

int charPositionInLine,

String msg,

RecognitionException e) {

if (message != null) return;

if (offendingSymbol instanceof Token) {

Token t = (Token) offendingSymbol;

start = t.getStartIndex();

stop = t.getStopIndex();

} else if (recognizer instanceof ToyLexer) {

ToyLexer lexer = (ToyLexer)recognizer;

start = lexer._tokenStartCharIndex;

stop = lexer._input.index();

}

this.line = line;

message = msg;

}

@Override public String toString() {

return start + "-" + stop + " l." + line + ": " + message;

}

}

}

top returns [String str]: e* EOF {$str = "All went well.";};

e: 'a' 'b' | 'a' 'c' e;

保存到Toy.g,然后尝试以下命令:

> java -jar antlr-4.5.2-complete.jar Toy.g

> javac -cp antlr-4.5.2-complete.jar Toy*.java

> java -cp .:tools/antlr-4.5.2-complete.jar ToyParser ab acab acc axb abc

ab => All went well.

acab => All went well.

acc => Failed, because 2-2 l.1: no viable alternative at input 'c'

axb => Parsed, but 1-1 l.1: token recognition error at: 'x'

Exception in thread "main" org.antlr.v4.runtime.misc.ParseCancellationException

at org.antlr.v4.runtime.BailErrorStrategy.recoverInline(BailErrorStrategy.java:90)

at org.antlr.v4.runtime.Parser.match(Parser.java:229)

at ToyParser.top(ToyParser.java:187)

at ToyParser.parse(ToyParser.java:95)

at ToyParser.main(ToyParser.java:80)

Caused by: org.antlr.v4.runtime.InputMismatchException

at org.antlr.v4.runtime.BailErrorStrategy.recoverInline(BailErrorStrategy.java:85)

... 4 more

一方面,我觉得我已经做得太多了.看看我为什么应该是一个简单和常见的任务写了多少代码,我不禁想知道我是否缺少一些更简单的解决方案.另一方面,即使这似乎还不够,有两个原因.首先,当我设法得到报告的词法分析器错误时,它们仍然不会阻止解析器继续剩下的流.这是解析的证据,但是输入axb的字符串.其次,我仍然遗漏了错误侦听器的报告错误,堆栈跟踪证明了这一点.

如果我不安装BailErrorStrategy,我会得到更有用的输出:

acc => Parsed, but 2-2 l.1: mismatched input 'c' expecting 'a'

axb => Parsed, but 1-1 l.1: token recognition error at: 'x'

abc => Parsed, but 2-2 l.1: extraneous input 'c' expecting {, 'a'}

有什么办法可以得到这种错误信息,但仍然保释错误?我可以see from the sources表示,这个无关的输入消息确实是由DefaultErrorStrategy生成的,显然是在它确定了如何解决问题之后.我应该让它这样做,然后保释,即写我自己的BailErrorStrategy变体,调用超级抛出?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值