2015-01-29 2 views
0

Вот вывод из консоли,Rascal: Get-аннотации не поддерживаются значение, когда ясно, что есть соответствующая @lab аннотация

Debug print.. 
exprNode(
    assign(
    var(name(name("alpha")))[ 
     @at=|file:///Users/apil/Dropbox/Scripts/Class_Based_Analysis/SimpleClass_CopyObject.php|(56,6,<9,0>,<9,0>), 
     @scope="scope"("","","",""), 
     @decl=|php+variable:///alpha|, 
     @phpdoc="", 
     @lab=lab(3) 
    ], 
    new(
     name(name("MyClass")[ 
      @at=|file:///Users/apil/Dropbox/Scripts/Class_Based_Analysis/SimpleClass_CopyObject.php|(67,7,<9,0>,<9,0>), 
      @scope="scope"("","","",""), 
      @phpdoc="" 
     ]), 
     [])[ 
     @at=|file:///Users/apil/Dropbox/Scripts/Class_Based_Analysis/SimpleClass_CopyObject.php|(63,13,<9,0>,<9,0>), 
     @scope="scope"("","","",""), 
     @phpdoc="", 
     @lab=lab(4) 
    ])[ 
    @at=|file:///Users/apil/Dropbox/Scripts/Class_Based_Analysis/SimpleClass_CopyObject.php|(56,20,<9,0>,<9,0>), 
    @scope="scope"("","","",""), 
    @phpdoc="", 
    @lab=lab(5) 
    ], 
    lab(5))[ 
    @lab=lab(5) 
] 
var(name(name("alpha")))[ 
    @at=|file:///Users/apil/Dropbox/Scripts/Class_Based_Analysis/SimpleClass_CopyObject.php|(56,6,<9,0>,<9,0>), 
    @scope="scope"("","","",""), 
    @decl=|php+variable:///alpha|, 
    @phpdoc="", 
    @lab=lab(3) 
] 
|rascal://soft::typing::php::elements::Identifier|(1678,6,<54,10>,<54,16>): get-annotation not supported on value at |rascal://soft::typing::php::elements::Identifier|(1678,6,<54,10>,<54,16>) 
☞ Advice 

и вот скрипт отвечает за генерацию контента:

LabelToIdentifierMap mapp=(); 
println("Debug print.."); 
iprintln(cfgNode); 
result=[e | /assign(e,_):=cfgNode]; 

if(isEmpty(result)) 
    return mapp; 

result=getElementFromSingletonList(result); 
iprintln(result); 
if(var(name(name(str x))):=result) 
    mapp +=([email protected]:var(x)); 
else if(propertyFetch(var(name(name(str x))),name(name(str y))):=result) 
    mapp +=([email protected]:propertySet(var(x),var(y))); 
else 
    throw "Unsupported expression encountered at left hand side of an assignment node.\n"+ 
    "Got: <result>. Error loc: 510142847"; 
return mapp; 

Я забочусь о том, что вывод переменной «result»: var (name (name («alpha»))) [@at = ...] показывает, что в прикрепленном к переменной знаке есть аннотация @lab. Почему я не могу получить его? Кроме того, как я могу получить его, если это вообще возможно!

ответ

0

Причиной может быть несколько вещей.

  • По крайней мере, язык должен знать тип значения, на которое вы хотите обратиться к аннотации. В настоящее время этот тип value, который не является достаточно конкретным. Я не знаю, почему это происходит в вашем примере, потому что не все детали даны. Вполне возможно, что getElementFromSingletonList возвращает value? Я бы использовать result[0] или написать параметризованную функцию типа, которая возвращает тип элемента: &T get([&T elem]) = elem;
  • Аннотация должна быть объявлена ​​прежде чем они могут быть использованы, как и в anno int [email protected]; или anno int [email protected];. Это можно сделать только для типов node или определенных типов data.

Так что, когда приемник @ набирается хорошо и метка аннотацию объявлена, то он будет работать, как ожидалось:

data MyExp = bla(); 
anno int [email protected]; 
MyExp example = bla()[@label=1]; 
println([email protected]); // prints 1 
+0

Спасибо .. это имеет смысл. Однако я использую параметризованную функцию для возврата элемента из «getElementFromSingletonList (..)». Эта функция гарантирует, что переданный аргумент представляет собой список только с одним элементом и в противном случае исключает исключение. Я думаю, что это может решить проблему. Result = [e |/assign (Expr e, _): = cfgNode], так как теперь шаблон явно сопоставляется с типом Expr, для которого аннотации справедливо объявлены. Есть предположения?? –

+1

Это поможет увидеть подпись функции, но если это что-то вроде 'value getElementFromSingletonList (list [value] l), было бы лучше иметь' & T getElementFromSingletonList (list [& T] l), чтобы он поддерживал тип элемент. –