我使用C#
版本生成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?)".
请告诉我们如何解决此问题。
答案 0 :(得分:0)
您的自定义令牌类名为' Token&#39 ;?如果是这样,请检查using语句以确保解析器不会混淆令牌类的Antlr4.Runtime.Token类。如果没有,请将其更改为自定义令牌类的实际类型。
答案 1 :(得分:0)
我在带有C ++目标的ANTLR4.7中遇到了完全相同的问题。上下文中令牌上的所有标签都正确使用我的自定义令牌类,但是分配这些标签的代码尚未准备就绪,尝试将基座Token *
分配给MyToken *
。我通过声明
virtual MyToken *match(size_t ttype) override;
virtual MyToken *matchWildcard() override;
virtual MyToken *getCurrentToken() override;
virtual MyToken *consume() override;
生成的解析器中的。所有这些覆盖都是自己的呼叫基础版本,并且该调用的结果是static_cast<MyToken *>
。我认为在C#中应该可以有类似的东西。
正确的方法可能需要修复相应的.stg文件(在/ org / antlr / v4 / tool / templates / codegen /&lt; target language&gt;在antlr .jar文件中) - 还有一种覆盖它的方法需要编辑原始.jar)所以生成的标签赋值代码执行这些强制转换,而不需要覆盖返回类型(或使其自动生成上述例程)。