我在文本中写了一个dsl,人们可以在其中声明一些变量。语法如下:
@ManyToMany
Dsl有一些方法,比如print方法:
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 ')';
我将所有变量都放在地图中,以便稍后在我的代码中使用它们。关键是识别它们是ID,这是一个字符串。 但是,在我的翻译中,我无法在字符串和ID
之间形成差异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"
答案 0 :(得分: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)
)可能会有所帮助
或者您可以尝试使用不剥离引号的STRINGValueaConcerter的特殊替换