ANTLR4自定义令牌

ANTLR4自定义令牌,antlr,antlr4,Antlr,Antlr4,我正在使用C#version生成ANTLR4文件。我通过使用此选项TokenLabelType=Token使用了自定义令牌。一切正常,但c编译器在MAtch(…)和input(…)中给出了错误,因为这不会对我的自定义标记进行类型转换。而ANTLR3为该函数提供了适当的类型转换。我正在从这个类扩展我自己的令牌Antlr4.Runtime.CommonToken C#编译器抛出此错误 Cannot implicitly convert type 'Antlr4.Runtime.IToken' to

我正在使用
C#
version生成
ANTLR4
文件。我通过使用此选项
TokenLabelType=Token
使用了自定义令牌。一切正常,但
c
编译器在
MAtch(…)
input(…)
中给出了错误,因为这不会对我的自定义标记进行类型转换。而ANTLR3为该函数提供了适当的类型转换。我正在从这个类扩展我自己的令牌
Antlr4.Runtime.CommonToken

C#编译器抛出此错误

Cannot implicitly convert type 'Antlr4.Runtime.IToken' to 'Grammar.ActionParser.Token'. An explicit conversion exists (are you missing a cast?)".

请告诉我如何解决这个问题

您的自定义令牌类名为“token”吗?如果是这样,请检查using语句以确保解析器不会混淆令牌类的Antlr4.Runtime.Token类。如果不是,将其更改为自定义令牌类的实际类型。

< P>我在C++目标中的AtLR4.7中有完全相同的问题。上下文中令牌上的所有标签都正确地使用了我的自定义令牌类,但是分配这些标签的代码还没有准备好,正在尝试将base
token*
分配给
MyToken*
。我通过声明

virtual MyToken *match(size_t ttype) override;
virtual MyToken *matchWildcard() override;
virtual MyToken *getCurrentToken() override;
virtual MyToken *consume() override;
在生成的解析器中。所有这些覆盖所做的就是调用它们自己的基本版本,并对调用的结果进行
static\u cast
。我想在C#中也应该有类似的东西


正确的方法可能需要修复适当的.stg文件(在/org/antlr/v4/tool/templates/codegen/inside antlr.jar文件下-还有一种方法可以重写它,而无需编辑原始的.jar),因此标签分配的生成代码执行这些转换,而无需重写返回类型(或使其自动生成上述例程)。

我已将令牌更改为“MyToken”。但仍然会出现相同的错误。生成文件时,ANTLR4必须将其键入以下行中的自定义令牌“((MulOPerationContext)\u localctx.op=\u input.Lt(1);”.鉴于ANTLR3将此类型转换为自定义标记,因此我在使用ANTLR3时没有遇到任何错误。请告诉我们,ANTLR4遗漏了什么。相同的错误意味着“完全”相同的错误?在任何情况下,将标记转换为上下文都是可疑的。将需要查看您的语法以进一步帮助。您好,感谢您的回复。请查找my grammar.options{TokenLabelType=MyToken;}语句:表达式EOF;表达式返回[object obj]:表达式op=(MULT | DIV)表达式#MulOPeration | INT#IntOperation;INT:[0-9]+;MULT:'*';DIV:'/';除了这个规则之外,我还重写了Emit()emitteof()和nextoken()函数。我用于执行此操作的命令是Plz help.ThanksPlease find MyToken类定义公共类MyToken:CommonToken{int refId;public int refId{get{return refId;}set{refId=value;}}public MyToken(元组输入,int类型,int通道,int开始,int停止):基(输入,类型,通道,开始,停止){}公共MyToken(int类型,字符串文本):基(类型,文本){}