2016-11-28 7 views
0

Я пишу dsl в тексте, в котором люди могут объявлять некоторые переменные. грамматика выглядит следующим образом:Xtext, делая разницу между идентификатором и строкой в ​​интерпретаторе

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

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" 

ответ

0

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

вы можете использовать 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)) может быть полезно

Или вы можете попробовать использовать специальную замену f или STRINGValueaConcerter, который не снимает кавычки

+0

спасибо за ответ, он действительно работает. как я могу проверить его? или я не могу из-за моей низкой репутации? –

+0

похоже, что вы его нашли –