我正在使用ANTLR并基于分离的Java6词法分析器和语法来构建一个AST。词法分析器定义包含在Java6Lex.g中,并生成语法使用的标记。解析器使用这些没有问题,但当我生成AST时,我想引入虚构的标记-然而,看起来ANTLR不喜欢这个模型。
解析器语法包括来自词法分析器的标记词汇表-这应该是语法可用的标记的基线。
parser grammar Java6Parse;
options {
tokenVocab=Java6Lex;
backtrack=true;
memoize=true;
output=AST;
language = CSharp3;
}现在,假设我想使用fieldDeclaration,并使用重写规则将其转换为根节点。我假设(显然是错误的)我可以将虚构的标记直接引入解析器语法中,如下所示:
fieldDeclaration
: modifiers type variableDeclarator (COMMA variableDeclarator)* SEMI
-> ^(FIELD modifiers type variableDeclarator+)
;但是,这只会导致发生以下错误:
reference to undefined token in rewrite rule: FIELD没问题,我明白,我没给它下定义。因此,我尝试在解析器语法的tokens部分中定义它。再一次,错误地认为tokenVocab应该提供基线。
tokens { FIELD; }不,似乎即使定义令牌块也会导致EarlyExitException和错误,表明Java6Parse.g没有规则。我想,解析器语法根本不喜欢在解析器中定义标记。所以,我在词法分析器中定义了它。再一次,这失败了。然后,我在词法分析器和解析器中定义了每个标记-同样,失败。
所以,这是我需要知道的。当词法分析器和解析器分开时,有没有一种方法来定义一个虚构的令牌?如果有,如何定义?如果不是,那么将语法和词法分析器合并到同一个文件中是唯一的选择吗?
发布于 2013-03-25 23:02:49
您很可能将tokens{}块包含在错误的位置。ANTLR 3要求文法标头元素以特定的顺序出现。有关正确的顺序,请参阅此堆栈溢出答案:
https://stackoverflow.com/questions/15615209
复制相似问题