【问题标题】:Implementation of the DefaultTerminalConverters in order to instantiate Integer instead of terminal rule in Xtext throws ClassCastExceptionDefaultTerminalConverters 的实现以实例化 Integer 而不是 Xtext 中的终端规则抛出 ClassCastException
【发布时间】:2019-02-24 22:55:51
【问题描述】:

我想实现我自己的 DefaultTerminalConverters 类来满足 Integer 而不是终端规则 VALUE_TERMINAL

我的语法中的VALUE_TERMINAL是:

terminal VALUE_TERMINAL: 
    ( '0' .. '9' )+ ;

我自己的 DefaultTerminalConverters 的代码是:

import com.google.inject.Inject;
import org.eclipse.xtext.common.services.DefaultTerminalConverters;
import org.eclipse.xtext.conversion.IValueConverter;
import org.eclipse.xtext.conversion.ValueConverter;
import org.eclipse.xtext.conversion.impl.AbstractLexerBasedConverter;
import org.eclipse.xtext.nodemodel.INode;

public class MyLangValueConverter extends DefaultTerminalConverters {
    @Inject MyINTValueConverter myINTValueConverter;

    @ValueConverter(rule="VALUE_TERMINAL") 
    public IValueConverter<Integer> VALUE_TERMINAL() {
        return myINTValueConverter;
    }

    private static class MyINTValueConverter extends AbstractLexerBasedConverter<Integer> {
        @Override
        public Integer toValue(String string, INode node) {
            return new Integer(string);
        }

        @Override
        public String toString(Integer value){
            return String.valueOf(value);
        }
    }
}

当我在自己的 DSL 中编写某些内容时,我总是在使用 VALUE_TERMINAL 时收到错误 java.lang.Integer cannot be cast to java.lang.String。可能是什么问题呢 ?

【问题讨论】:

  • 异常发生在哪一行?
  • 这个类中不会出现。当我用我的 DSL 运行新的 Eclipse 实例并在这个 DSL 中写一些东西时,我可以看到 toValue() 方法在 VALUE_TERMINAL 规则被实例化时正确执行。但是在第二个 Eclipse 实例的控制台中,我看到了那个异常,但我不知道它来自哪里。

标签: dsl xtext


【解决方案1】:

问题出在语法上:

terminal VALUE_TERMINAL: 
( '0' .. '9' )+ ;

简称

import "http://www.eclipse.org/emf/2002/Ecore" as ecore
...
terminal VALUE_TERMINAL returns ecore::EString: 
( '0' .. '9' )+ ;

因此您需要明确指定终端规则的返回数据类型。像

terminal VALUE_TERMINAL returns ecore::EInt:

terminal VALUE_TERMINAL returns ecore::EIntegerObject:

【讨论】:

  • returns ecore::EIntegerObject 有效。谢谢@Christian
猜你喜欢
  • 2017-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-08
  • 2013-07-09
  • 2017-07-09
  • 2012-09-12
  • 1970-01-01
相关资源
最近更新 更多