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, которая не удаляет кавычки