当前位置: 首页 > 知识库问答 >
问题:

如何为独立的ANTLR lexer&parser添加虚拟标记?

农均
2023-03-14

我正在使用ANTLR并基于分离的Java6 lexer&grammar构建一个AST。lexer定义包含在java6lex.g中,并生成语法使用的令牌。解析器使用这些没有问题,但是当我生成AST时,我想引入想象的令牌--然而,ANTLR似乎不喜欢这个模型。

parser grammar Java6Parse;

options {
    tokenVocab=Java6Lex;
    backtrack=true;
    memoize=true;
    output=AST;
    language = CSharp3;
}
fieldDeclaration
    :   modifiers type variableDeclarator (COMMA variableDeclarator)* SEMI
            -> ^(FIELD modifiers type variableDeclarator+)
    ;
reference to undefined token in rewrite rule: FIELD
tokens { FIELD; }

不,似乎即使定义一个令牌块也会导致EarlyExitException和指示java6parse.g没有规则的错误。我想,解析器语法不喜欢在解析器中定义令牌。所以,我在lexer中定义了它。这又一次失败了。然后我在lexer和parser中定义了每个令牌--再次失败。

所以,以下是我需要知道的。当lexer和parser分离时,是否有方法定义一个虚构的令牌,如果是,如何定义。如果不是,唯一的选择是将语法和lexer组合回同一个文件吗?

共有1个答案

勾长卿
2023-03-14

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

在ANTLR中使用@Header

 类似资料:
  • 本文向大家介绍用virtualenv建立多个Python独立虚拟开发环境,包括了用virtualenv建立多个Python独立虚拟开发环境的使用技巧和注意事项,需要的朋友参考一下 本文为大家分享了virtualenv建立多个Python独立虚拟开发环境,供大家参考,具体内容如下 1、安装virtualenv: 2、创建一个python的虚拟环境: 用virtualenv创建虚拟环境,是通过复制全局

  • 问题内容: 当前是否可以使用node.js服务器进行虚拟托管(即在一个IP下托管多个域)? 问题答案: 当然,您可以为此专门使用Bouncy或node-http- proxy 。 还有一个Express解决方案。看看这个例子。

  • 我正在创建一个这样的表, 但我想增加一列。在原始SQL中看起来是这样的: 如何将其添加到迁移中?我还需要在上面创建一个索引。

  • 我有一个部署在JBoss WildFly 16.0上的JavaEE8应用程序。0.Final,它使用Hibernate OGM访问MongoDB。 我已经建立了一个定制的码头集装箱 并为Hibernate OGM添加了所需的模块/罐,并添加了我的耳朵。 我可以构建和运行Docker映像,它启动正常,尽管无法连接到MongoDB容器。我需要添加我的数据源等。 容器ID映像命令 已创建状态端口 名称f

  • 当我试图将模式更改为“集群”时,它失败了。在web UI中,我看到驱动程序正在运行,但应用程序失败。 编辑的 在日志中,我看到以下内容: 16/03/23 09:06:46信息大师:注册ID为APP-20160323090646-0007的应用wibeee-pipeline 16/03/23 09:06:46信息主:启动执行人App-20160323090646-0007/0关于工人工人-2016

  • 我试图为WAS Liberty server创建Maven项目。 mvn原型:generate-DarchetypeGroupId=net。瓦斯德夫。wlp。maven-DarchetypeArtifactId=liberty原型ear-DarchetypeVersion=2.2-DgroupId=com。测试-DartifactId=test-Dversion=1.0-SNAPSHOT 您能告诉