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

时间:2016-11-28 10:56:08

标签: dsl xtext xtend

我在文本中写了一个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" 

1 个答案:

答案 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的特殊替换