2013-02-13 43 views
1

我看答案How to get ANTLR 3.2 to exit upon first error?这是有帮助的。ANTLR语法 - 如何添加成员覆盖错误处理

不过,我似乎无法在没有我的语法吓坏了添加这些“@”的规则。我的语法文件很简单:

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 '{'  

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

回答

2

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

grammar Exp; 

options { 
    ... 
} 

tokens { 
    ... 
} 

@parser::header { 
    ... 
} 

@lexer::header { 
    ... 
} 

@parser::members { 

    ... 
} 

@lexer::members { 
    ... 
} 

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

我还可以记得一定3.x版(S)曾与空部分的问题:确保没有在所有部分至少东西,否则忽略空段。

+0

谢谢。有效。我在另一个问题的覆盖中添加了,我的主类现在可以捕获异常。然而抛出的异常是不是非常丰富: MismatchedTokenException异常(18 = 49!) 我怎样才能得到: 线在1:57缺少RPAREN '{' 消息?有没有办法从覆盖中“提取”它或以不同的方式来覆盖? – Awoken 2013-02-14 18:56:06

+0

@Awoken,这里没有银弹。检查异常,进行相应的转换并从异常中提取想要的信息。尽管如此,我们不要将这些小型评论框用于广泛的问答。 – 2013-02-14 19:08:45