Antlr:常见的令牌定义

时间:2017-09-18 20:18:17

标签: parsing antlr antlr4

我想在单个中央Antlr文件中定义公共标记常量。这样我就可以定义几个不同的词法分析器和解析器,并在运行时混合和匹配它们。如果它们共享一组共同的令牌定义,那么它们将正常工作。

换句话说,我想在每个词法分析器中看到public static final int WORD = 2;,所以他们都同意“2”是WORD。

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

tokens {
WORD, NUMBER
}

并包括

options { tokenVocab = CommonTokenDefs; }

在我的每个其他.g4文件中。它不起作用。包含tokenVocab的.g4文件将在定义标记类型时分配不同的常量int,更糟糕的是,在其.tokens文件中它将包含重复的常量!

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

执行import CommonTokenDefs;也不起作用,因为如果我在词法分析器中定义了一个令牌类型,并且它已经在CommonTokenDefs中,那么我会得到一个“令牌名称FOO已定义”错误。

如何在词法分析器和解析器之间创建通用词汇表?

1 个答案:

答案 0 :(得分:2)

包含语法意味着merge it。导入的语法不是自己的实例,而是丰富了导入的语法。导入语法根据其中定义的内容对其标记进行编号(并从导入的语法中添加标记)。

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

更新

实际上, 是一种让它按您的需要运行的方法。除了import语句(用于导入语法)之外,还有tokenVocab语法选项,用于加载带有数字值赋值的* .tokens文件到标记。通过使用这样的令牌词汇表,您可以预定义ANTLR应该为每个令牌使用哪个值,从而可以确定某些令牌始终获得相同的数值。请参阅生成的* .tokens文件以获取所需格式。

我使用* .tokens文件来分配数值,以便某些关键字被放置在一个连续的值范围内,这样可以在以后进行有效的检查,例如:

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

如果ANTLR可以为每个关键字自由分配值,那将是不可能的。