Xtext,在解释器中区分 ID 和 String
Xtext, making the difference between ID and String at the interpreter
我正在用文本编写一个 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' '(' ')'
;
我将所有变量都放在地图中,以便稍后在我的代码中使用它们。识别它们的关键是它们的 ID,它是一个字符串。
但是,在我的解释器中,我无法区分字符串和 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"
您当前的语法结构很难做到这一点,因为您在填写地图的地方丢弃了信息。
您可以使用 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
我正在用文本编写一个 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' '(' ')'
;
我将所有变量都放在地图中,以便稍后在我的代码中使用它们。识别它们的关键是它们的 ID,它是一个字符串。 但是,在我的解释器中,我无法区分字符串和 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"
您当前的语法结构很难做到这一点,因为您在填写地图的地方丢弃了信息。
您可以使用 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