繁体   English   中英

Antlr:通用令牌定义

[英]Antlr: common token definitions

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

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

我创建了一个名为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已定义”错误。

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

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

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

更新资料

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM