为了在 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:
我想实现自己的 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: