如何为分离的ANTLR词法分析器添加虚构标记&解析器?

时间:2013-03-25 12:39:40

标签: c# antlr antlr3 lexer

我正在使用ANTLR构建一个AST,并基于分离的Java6词法分析器和语法。词法分析器定义包含在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

没问题,我明白了,我没有定义它。所以,我尝试在解析器语法的标记部分中定义它。再次,错误地思考,tokenVocab应该提供基线。

tokens { FIELD; }

不,似乎即使定义一个令牌块也会导致EarlyExitException和一个错误,表明Java6Parse.g没有规则。我想,解析器语法根本不喜欢在解析器中定义的标记。所以,我在词法分析器中定义了它。再次,那失败了。然后我在词法分析器和解析器中定义了每个标记 - 再次,失败。

所以,这就是我需要知道的。有没有办法在词法分析器和解析器分离时定义一个虚构的标记,如果是这样的话。如果没有,是将语法和词法分析器合并回同一文件的唯一选择吗?

1 个答案:

答案 0 :(得分:3)

您最有可能将tokens{}块包含在错误的位置。 ANTLR 3要求语法标题元素以特定顺序出现。请参阅此Stack Overflow答案以获取正确的顺序:

Using @header in ANTLR