BR.Hamza
BR.Hamza

Reputation: 199

Xtext, making the difference between ID and String at the interpreter

I'm writing a dsl in a text in which people can declare some variables. the grammar is as follows:

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 ')';   

the Dsl has some methods like the print method:

Print: 
'PRINT' '('  var0=(STRING|ID) (','var1+=(STRING|ID) )* ')' |
'PRINT' '(' ')'

;

I put all my variables in map so I can use them later in my code. the key is identifying them is their ID which is a string. However, in my interpreter I can't make the différence between a string and an 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")} ]
} 

For example when I write PRINT ("attribut2",attribut2) the result shoud be

attribut2 "the value of attribut2" 

but I get

"the value of attribut2" "the value of attribut2"

Upvotes: 0

Views: 842

Answers (1)

Christian Dietrich
Christian Dietrich

Reputation: 11868

your current grammar structure makes it hard to do this since you throw away the information at the point where you fill the map.

you can use org.eclipse.xtext.nodemodel.util.NodeModelUtils.findNodesForFeature(EObject, EStructuralFeature) to obtain the actual text (which still may contain the original value including the ""

or you change your grammar to

var0=Value ...
Value: IDValue | StringValue;
IDValue: value=ID;
StringValue: value=STRING;

then you can have a look at the type (IDValue or StringValue) to decide wheather you need to put the text into "" (org.eclipse.xtext.util.Strings.convertToJavaString(String, boolean)) might be helpful

Or you can try to use a special replacement for STRINGValueaConcerter that does not strip the quotation marks

Upvotes: 0

Related Questions