Xtext,在解释器中区分 ID 和 String

Xtext, making the difference between ID and String at the interpreter

我正在用文本编写一个 dsl,人们可以在其中声明一些变量。语法如下:

Cosem:
cosem+=ID '=' 'COSEM' '(' class=INT ',' version=INT ','  obis=STRING ')' ;
Attributes :
attribute+=ID '=' 'ATTRIBUTE' '(' object=ID ',' attribute_name=STRING ')' ;
Action:
action+=ID '=' 'ACTION' '(' object=ID ',' action_name=STRING ')';   

Dsl有一些方法比如打印方法:

Print: 
'PRINT' '('  var0=(STRING|ID) (','var1+=(STRING|ID) )* ')' |
'PRINT' '(' ')'

;

我将所有变量都放在地图中,以便稍后在我的代码中使用它们。识别它们的关键是它们的 ID,它是一个字符串。 但是,在我的解释器中,我无法区分字符串和 ID

def dispatch void exec(Print p) {

    if (LocalMapAttribute.containsKey(p.var0) )
     {print(LocalMapAttribute.get(p.var0))}
    else if (LocalMapAction.containsKey(p.var0)){print(LocalMapAction.get(p.var0))}
    else if (LocalMapCosem.containsKey(p.var0)){print(LocalMapCosem.get(p.var0))}
    else
    {print("erreeeur Print")}

     p.var1.forEach[v
        | if (LocalMapAttribute.containsKey(v)){print(LocalMapAttribute.get(v))}
                       else if (LocalMapAction.containsKey(v)){print(LocalMapAction.get(v))}
                       else if (LocalMapCosem.containsKey(v)){print(LocalMapCosem.get(v))} 
                       else{print("erreur entre print")} ]
} 

例如当我写PRINT ("attribut2",attribut2)时结果应该是

attribut2 "the value of attribut2" 

但我明白了

"the value of attribut2" "the value of attribut2"

您当前的语法结构很难做到这一点,因为您在填写地图的地方丢弃了信息。

您可以使用 org.eclipse.xtext.nodemodel.util.NodeModelUtils.findNodesForFeature(EObject, EStructuralFeature) 获取实际文本(其中仍可能包含原始值,包括 ""

或者您将语法更改为

var0=Value ...
Value: IDValue | StringValue;
IDValue: value=ID;
StringValue: value=STRING;

然后您可以查看类型(IDValue 或 StringValue)来决定是否需要将文本放入 ""org.eclipse.xtext.util.Strings.convertToJavaString(String, boolean))可能会有帮助

或者您可以尝试使用不去除引号的特殊替换 STRINGValueaConcerter