【问题标题】:Handling custom exception in ANTLR4在 ANTLR4 中处理自定义异常
【发布时间】:2014-12-28 02:31:24
【问题描述】:

我有一个语法,它在词法分析器中解析 URI,然后在语法操作中从它们构造一个 java.net.URL。词法分析器可以接受可能不是合法 URL 的字符串,所以如果它们被抛出,我想智能地处理 URISyntaxExceptions。

我是 ANTLR 4 的新手(但在 ANTLR 3 上花了一些时间),只是想知道在 4 中处理此类异常的最佳实践。

这是语法中的代码 sn-p:

iri returns [IRI term] :
    IRIREF 
    { $term = spt.getIRI($IRIREF.text); } |
    prefixedName
    ;

'spt' 是我为启动规则设置的一个支持对象。方法“getIRI”可以抛出java.net.URISyntaxException。我想要一种优雅的方式来在规则中本地处理这个问题,终止解析(或做其他事情),但不知道在哪里附加一个 catch 块。

【问题讨论】:

  • 我也有使用 ANTLR3 的经验(在 ANTLR4 中几乎没有),所以我能感受到你的痛苦。如果您发布代码和您当前的策略,那么我可以保证至少投票(如果没有任何实际帮助)。因为您的问题可能会因为过于宽泛或主要基于意见而被关闭。
  • 谢谢,艾略特。我添加了一个 sn-p。
  • 想到另一个解决方案 - 我可以修改支持对象以引发自定义运行时异常并在开始生产之外捕获它。我对此并不满意,但它会让我暂时继续前进。

标签: java error-handling antlr4


【解决方案1】:

documentation 涵盖了捕获错误的基础知识和错误策略的实施。 Definitive ANTLR 4 Reference 更详细地涵盖了这两个主题。

更新:

“规则”的实际语法规范(来自 ANTLRv4Parser.g4)是

parserRuleSpec
  : DOC_COMMENT?
    ruleModifiers? RULE_REF ARG_ACTION?
    ruleReturns? throwsSpec? localsSpec?
    rulePrequel*
    COLON
    ruleBlock
    SEMI
    exceptionGroup
  ;

(在相关部分,这与 ANTLRParser.g 中的“规则”规范相同,这是用于构建 Antlr v4 jar 中存在的编译器工具的实际语法。)

【讨论】:

  • 是的,我先尝试过。事情是文档中的语法是错误的。它显示了规则终止符 (;) 之后的 catch 子句,它不解析。将它放在分号解析之前。
  • 当你说它不解析时,你得到了什么错误?它是否给出任何其他错误或警告?如果它使用 SEMI 上方的 catch 块进行解析,请检查生成的代码以查看它是否将 catch 附加到规则的最后一个 alt。
猜你喜欢
  • 1970-01-01
  • 2011-06-11
  • 2015-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-15
  • 2013-08-05
  • 1970-01-01
相关资源
最近更新 更多