为了在 Xtext 中实例化 Integer 而不是终端规则而实施 DefaultTerminalConverters 会抛出 ClassCastException

Implementation of the DefaultTerminalConverters in order to instantiate Integer instead of terminal rule in Xtext throws ClassCastException

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

问题出在语法上:

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: