在Antlr3

时间:2017-05-17 04:30:05

标签: exception antlr3 lexer

如何捕获词法分析器中的异常?在解析器中,如果规则失败(或与给定输入流不匹配),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' '"');  

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

1 个答案:

答案 0 :(得分:0)

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

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

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