【问题标题】:ANTLR grammar - how to add members overwrite error handlingANTLR 语法 - 如何添加成员覆盖错误处理
【发布时间】:2013-02-13 19:59:33
【问题描述】:

我看到答案How to get ANTLR 3.2 to exit upon first error? 很有帮助。

但是,我似乎无法添加这些 '@' 规则,否则我的语法会被吓坏。我的语法文件很简单:

 grammar Exp;
 options {
 output=AST;

 }

 program 
  : includes decls (procedure)*  main  -> ^(SMALLCPROGRAM includes decls (procedure)*    main) //AST - PROGRAM root
  ;

   //Lexer and Parser rules continue below as normal..tested thoroughly and works

但是,如果我尝试添加这些 @ 规则中的任何一个,我会收到如下错误:

grammar file Exp.g has no rules

和:

 Exp.g:0:1: syntax error: assign.types: org.antlr.runtime.EarlyExitException

 org\antlr\grammar\v3\DefineGrammarItemsWalker.g: node from line 202:4 required (...)+ loop did not match anything at input ';'

有人知道问题出在哪里吗?我只是想改变我的语法,这样当我从单独的主类运行它时(使用 ANTLRStringStream 等将输入传递给它),当出现语法问题时,它实际上会在主类中抛出一个错误,而不是仅仅说:

line 1:57 missing RPAREN at '{'       

在继续解析输入的其余部分之前。最终,我的主类应该拒绝解析我的语法定义的任何语法错误的输入,并且应该向用户报告错误。

【问题讨论】:

    标签: error-handling antlr antlr3


    【解决方案1】:

    您可能有不正确的部分/块的顺序。确保它看起来像这样:

    grammar Exp;
    
    options {
      ...
    }
    
    tokens {
      ...
    }
    
    @parser::header {
      ...
    }
    
    @lexer::header {
      ...
    }
    
    @parser::members {
    
      ...
    }
    
    @lexer::members {
      ...
    }
    

    我猜你在tokens { ... } 块之前放置了一个@member 或@header 部分。 tokens { ... } 应该直接在之后 options { ... }。

    我还记得某些 3.x 版本存在空白部分的问题:确保所有部分中至少有一些内容,否则忽略空白部分。

    【讨论】:

    • 谢谢。有效。我添加了另一个问题的覆盖,我的主类现在确实捕获了一个异常。但是抛出的异常信息不是很丰富:MismatchedTokenException(18!=49) 如何获得:第 1:57 行在“{”消息处缺少 RPAREN?有没有办法从覆盖中“提取”它或另一种覆盖方式?
    • @Awoken,这里没有灵丹妙药。检查异常,进行相应的转换并从异常中提取想要的信息。不过,我们不要将这些小评论框用于广泛的问答。
    猜你喜欢
    • 1970-01-01
    • 2012-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多