[英]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.