为了实例化Integer而不是Xtext中的终端规则,DefaultTerminalConverters的实现引发ClassCastException

时间:2019-02-19 22:05:37

标签: dsl xtext

我想实现自己的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。可能是什么问题呢 ?

1 个答案:

答案 0 :(得分: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: