有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Xtext,实现长、双精度和浮点类型

问题很简单
如何在Xtext语法中正确实现longdoublefloat类型,以便以后在解释器中使用它们? 解释器是一个extend

编辑1

在我的代码中,我有

IDValue: value=ID;
StringValue: value=STRING;
IntValue : value=INT;

SimpleValue:

     IntValue | StringValue
;

我想要一些像

DoubleValue : value=DOUBLE;

在我的翻译中,我能做到

if (p.var0 instanceof StringValue)  : 

我也希望这样做

 if (p.var0 instanceof DoubleValue)  : 

编辑2

这是语法:

Set:
    'SET' '(' attribute=ID ',' value=(AttributeValue ) ')'
;


StringValue: value=STRING;
IntValue : value=INT;
LongValue : value = LONG;
DoubleValue : value=DOUBLE;

SimpleValue:

     IntValue | StringValue | LongValue | DoubleValue
;


Structure: {Structure}
    '{' ID ':' var0=AttributeValue (',' ID ':' var1+=AttributeValue)* '}'
;

Array: {Array}
    '[' var0=AttributeValue(',' var1+=AttributeValue)* ']' 
;

AttributeValue : 
    SimpleValue |
    Structure |
    Array 
;

LONG returns ecore::ELong: INT ("L"|"l");
DOUBLE returns ecore::EDouble : INT'.'INT;

这是我的解释器中的类,在这里我执行Set函数,并且必须识别变量的类型(在Xtend中):

def dispatch void exec(Set s) {
    val setAttribute = LocalMapAttribute.get(s.attribute.toString)
    val cosem = LocalMapCosem.get(setAttribute.object)
    val setValue = s.value.getType
    if (setValue instanceof Array) {Jtest.SetFunction(cosem,setAttribute.attribute_name,ArrayToList(setValue),"Array")} 
    else if (setValue instanceof String) {Jtest.SetFunction(cosem,setAttribute.attribute_name,setValue)}
    else if (setValue instanceof Structure) {Jtest.SetFunction(cosem,setAttribute.attribute_name,StructToList(setValue),"Struct")}
    else if (setValue instanceof Long) {println("LONG DETECTED" + setValue)}
    else if (setValue instanceof Double) {println("DOUBLE DETECTED" + setValue)}
    else if (setValue instanceof Integer) {Jtest.SetFunction(cosem,setAttribute.attribute_name,setValue )}
    
} 

要识别类型,请使用以下方法:

def dispatch Array  getType (Array array){
//println("SET with Array") 
return array
}
def dispatch getType (SimpleValue simple){
    //println("SET with Simple Value") 
    return getTypeSimple(simple)
}
def dispatch Structure getType (Structure structure){
    //println("SET with Strcutre")
    return structure
}
def dispatch String getTypeSimple (StringValue str){
    //println("SET with Sting")
    return (str.value as String)
}
def dispatch int getTypeSimple (IntValue Int){
    //println("SET with int")
    return (Int.value )
}
def dispatch double getTypeSimple (DoubleValue Int){
    
    println("SET with DoubleValue")
    return (Int.value )
}
def dispatch long getTypeSimple (LongValue Int){
    println("SET with LongValue")
    return (Int.value )
}

值转换器:

public class MyDslValueConverters extends DefaultTerminalConverters {

    IValueConverter<Long> longValueConverter = new IValueConverter<Long>() {

        @Override
        public Long toValue(String string, INode node) throws ValueConverterException {
            // TODO make this more robust
            return Long.parseLong(string.substring(0, string.length()-1));
        }

        @Override
        public String toString(Long value) throws ValueConverterException {
            // TODO make this more robust
            return Long.toString(value)+"L";
        }

    };
    
    IValueConverter<Double> DoubleValueConverter = new IValueConverter<Double>() {

        @Override
        public Double toValue(String string, INode node) throws ValueConverterException {
            // TODO make this more robust
            return Double.parseDouble(string);
        }

        @Override
        public String toString(Double value) throws ValueConverterException {
            // TODO make this more robust
            return Double.toString(value);
        }

    };

}

共 (1) 个答案

  1. # 1 楼答案

    可以使用import "http://www.eclipse.org/emf/2002/Ecore" as ecore导入ecore元模型及其数据类型。然后您可以将它们用作终端或数据类型规则LONG returns ecore::ELong: INT ("L"|"l");中的返回值。最后,您必须实现一个ValueConverter,它完成从String到Long的转换,反之亦然

    public class MyDslValueConverters extends DefaultTerminalConverters {
    
        IValueConverter<Long> longValueConverter = new IValueConverter<Long>() {
    
            @Override
            public Long toValue(String string, INode node) throws ValueConverterException {
                // TODO make this more robust
                return Long.parseLong(string.substring(0, string.length()-1));
            }
    
            @Override
            public String toString(Long value) throws ValueConverterException {
                // TODO make this more robust
                return Long.toString(value)+"L";
            }
    
        };
    
        @ValueConverter(rule = "LONG")
        public IValueConverter<Long> LONG() {
            return longValueConverter;
        }
    
    }
    

    别忘了装订

    class MyDslRuntimeModule extends AbstractMyDslRuntimeModule {
    
        override bindIValueConverterService() {
            return MyDslValueConverters
        }
    
    }