【问题标题】:Catch the exception in the lexer in Antlr3在 Antlr3 的词法分析器中捕获异常
【发布时间】:2017-05-17 04:30:04
【问题描述】:

如何在词法分析器中捕获异常?在解析器中,如果规则失败(或与给定的输入流不匹配)Antlr 将抛出异常,我们可以轻松捕获此异常。在 Antlr3 的词法分析器中捕获异常。Ref:Error handeling in antlr 3.0...

attribute  :
      Value1 integer1["Value1"] { System.out.println("Accepted"); }
   |  Value2 integer2["Value2"] { System.out.println("Accepted"); }
   ;
catch[Exception e] {System.out.println("General error Reported");}

它可以在解析器中工作。但是我怎样才能在词法分析器本身中捕获异常呢?在解析器中说我有像

这样的规则
str:STRING|DIGIT;

在词法分析器中,STRING 被定义为

STRING : ('"' 'a'..'z' '"');  

我的输入流是“上帝”......如果我错过了双引号或者如果我放了额外的双引号,那么我希望这个异常应该在词法分析器本身中被捕获......有什么方法可以做到这一点?有可能吗?

【问题讨论】:

    标签: exception antlr3 lexer


    【解决方案1】:

    重写以下一种或多种方法以使用 ANTLR 自己的异常处理(这适用于词法分析器和解析器) - 请注意,这仅适用于由输入不匹配引起的异常:

    • emitErrorMessage() - 处理消息如何显示给用户
    • getErrorHeader() - 更改错误消息头的创建方式
    • getErrorMessage() - 更改错误描述的创建方式
    • displayRecognitionError() - 更改从异常创建消息的方式,或完全更改处理异常的方式

    ANTLR 的词法分析器和解析器之间的主要区别在于,在词法分析器中,没有开始规则或“当前”规则——词法分析器尝试并行匹配所有可用的规则。因此,如果发生不匹配,则不能将其归因于任何特定规则(因此也无法使用 catch 块在任何特定规则中进行处理)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-16
      • 2013-09-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多