ANTLR4自定义令牌

时间:2014-11-19 10:14:53

标签: antlr antlr4

我使用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?)".

请告诉我们如何解决此问题。

2 个答案:

答案 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)所以生成的标签赋值代码执行这些强制转换,而不需要覆盖返回类型(或使其自动生成上述例程)。