Xtext, делая разницу между ID и String в интерпретаторе

Я пишу 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' '(' ')'

;

Я поместил все свои переменные в карту, чтобы потом использовать их в своем коде. ключ, идентифицирующий их, является их идентификатором, который является строкой. Тем не менее, в моем интерпретаторе я не могу сделать различие между строкой и идентификатором

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"

1 ответ

Решение

Ваша текущая грамматическая структура затрудняет это, поскольку вы выбрасываете информацию в тот момент, когда вы заполняете карту.

ты можешь использовать 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, которая не удаляет кавычки

Другие вопросы по тегам