首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何为一个独立的ANTLR词法分析器和解析器添加虚构的标记?

如何为一个独立的ANTLR词法分析器和解析器添加虚构的标记?
EN

Stack Overflow用户
提问于 2013-03-25 20:39:40
回答 1查看 1.1K关注 0票数 2

我正在使用ANTLR并基于分离的Java6词法分析器和语法来构建一个AST。词法分析器定义包含在Java6Lex.g中,并生成语法使用的标记。解析器使用这些没有问题,但当我生成AST时,我想引入虚构的标记-然而,看起来ANTLR不喜欢这个模型。

解析器语法包括来自词法分析器的标记词汇表-这应该是语法可用的标记的基线。

代码语言:javascript
复制
parser grammar Java6Parse;

options {
    tokenVocab=Java6Lex;
    backtrack=true;
    memoize=true;
    output=AST;
    language = CSharp3;
}

现在,假设我想使用fieldDeclaration,并使用重写规则将其转换为根节点。我假设(显然是错误的)我可以将虚构的标记直接引入解析器语法中,如下所示:

代码语言:javascript
复制
fieldDeclaration
    :   modifiers type variableDeclarator (COMMA variableDeclarator)* SEMI
            -> ^(FIELD modifiers type variableDeclarator+)
    ;

但是,这只会导致发生以下错误:

代码语言:javascript
复制
reference to undefined token in rewrite rule: FIELD

没问题,我明白,我没给它下定义。因此,我尝试在解析器语法的tokens部分中定义它。再一次,错误地认为tokenVocab应该提供基线。

代码语言:javascript
复制
tokens { FIELD; }

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

所以,这是我需要知道的。当词法分析器和解析器分开时,有没有一种方法来定义一个虚构的令牌?如果有,如何定义?如果不是,那么将语法和词法分析器合并到同一个文件中是唯一的选择吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-25 23:02:49

您很可能将tokens{}块包含在错误的位置。ANTLR 3要求文法标头元素以特定的顺序出现。有关正确的顺序,请参阅此堆栈溢出答案:

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15615209

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档