我看到答案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等将输入传递给它)时,当存在语法问题时它实际上会在主类中抛出错误而不是仅仅说出类似的内容: / p>
line 1:57 missing RPAREN at '{'
在继续解析剩下的输入之前。最终,我的主类应该拒绝解析语法定义的任何语法错误输入,并应该向用户报告错误。
答案 0 :(得分:2)
您可能错误地了解了部分/块的顺序。确保它看起来像这样:
grammar Exp;
options {
...
}
tokens {
...
}
@parser::header {
...
}
@lexer::header {
...
}
@parser::members {
...
}
@lexer::members {
...
}
我猜你在@member
区块之前放置了@header
或tokens { ... }
部分。 tokens { ... }
应该在 options { ... }
后直接。
我还记得某些3.x版本有空白部分的问题:确保所有部分中至少有一些内容,否则省略空部分。