2017-03-07 34 views
0

在ANTLR 4中,通过实现ANTLRErrorListener可以扩展错误/异常处理。只有当我遍历使用词法分析器和解析器创建的树时,才会触发事件。 例如ANTLR 4在触发监听事件之前预先进行错误和异常处理

parser.removeErrorListeners(); 
parser.addErrorListener(new MyTryDSLErrorListener()); 
ParseTreeWalker walker = new ParseTreeWalker(); 
MyTryDSLListener listener = new MyTryDSLListener(); // Can be replaced by default Base listener(empty implementation) 
walker.walk(listener, parser.test()); // At this line tree will be traversed and if any error then MyTryDSLErrorListener's callback will be called. 

我想知道有没有干净的方式来获得输入 字符串错误,而无需调用监听器/访问者。

注:虽然没有用的默认实现替换监听器来处理此问题的方法。然后再次遍历树自己实现的听众,就像如下:

walker.walk(new TryDSLBaseListener(), parser.test()); // Find if has any errors. 
walker.walk(new MyTryDSLListener(), parser.test()); // Actual use case. 

回答

0

ANTLRErrorListener只有在分析过程中报告通过在线解析器遇到错误。也就是说,侦听器报告语法错误是由于语法分析器执行语法的启动规则而导致的。

监听器没有参与分析树步行操作。

更新

parser.removeErrorListeners(); 
parser.addErrorListener(new MyTryDSLErrorListener()); 
ParseTree tree = parser.test(); 

调用parser.test()启动分析器执行以创建解析树。在执行期间,如果并且在解析器遇到错误时,解析器通过在解析器中注册的ANTLRErrorListener报告错误。所有此类错误将在parser.test()返回时报告。

此时已经构建了一个分析树。步行与树木建设完全分离。解析器注册ANTLRErrorListener s将不会被调用。

ParseTreeWalker walker = new ParseTreeWalker(); 
MyTryDSLListener listener = new MyTryDSLListener(); 
walker.walk(listener, tree); 
+0

您可以请详细解释_解析器中的解析器_或如果可能请您提供给我的教程。如果我理解它,那么我应该将它改为:'parser.test();'?然后添加听众并穿过树? –