ANTLR:通用令牌定义



我想在单个中央antlr文件中定义通用令牌常数。这样,我可以定义几个不同的词汇和解析器,并在运行时混合并匹配它们。如果他们都共享一组通用的令牌定义,那么它们将正常工作。

换句话说,我想在每个Lexer中看到public static final int WORD = 2;,所以他们都同意一个" 2"是一个单词。

我创建了一个名为commontokendefs.g4的文件,并添加了这样的部分:

tokens {
WORD, NUMBER
}

,包括

options { tokenVocab = CommonTokenDefs; }

在我的每个其他.G4文件中。它行不通。包含TokenVocab的.G4文件,如果它定义了令牌类型,更糟糕的是,在其.tokens文件中,它将包含重复常数!

FOO=1
BAR=2
WORD=1
NUMBER=2

执行import CommonTokenDefs;也不起作用,因为如果我在Lexer中定义了一个令牌类型,并且已经在Commontokendefs中,那么我已经定义了" token name foo"错误。

我如何在lexers and Parsers之间创建一个常见的词汇?

包括语法意味着合并它。导入的语法不是一个自己的实例,而是丰富了其导入的语法。以及基于其定义的代币导入的语法编号(并从进口语法中添加令牌)。

如果可能的话,我在这里看到的唯一解决方案是在所有解析器中使用单个Lexer语法。您可以使用不同的基本词法(ANTLR选项:superClass)在Lexer中实现某些变化,但这当然是有限的,尤其不允许添加更多的令牌。

update

实际上,使其按照您想要的方式工作的一种方法。除了导入语句(用于导入语法)外,还有tokenVocab语法选项,该选项用于加载一个 *.tokens文件,并将数字值分配给令牌。通过使用这样的令牌词汇,您可以预先定义ANTLR应用于每个令牌的值,因此可以确定某些令牌始终获得相同的数字值。请参阅所需格式的生成 *.tokens文件。

i使用 *.tokens文件分配数字值,以便将某些关键字放置在连续值范围内,允许稍后进行有效的检查,例如:

if (token >= KW_1 && token < KW100) ...

,如果antlr将值自由分配给每个关键字。

是不可能的。

相关内容

  • 没有找到相关文章

最新更新