这是控制台的输出,
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 +=(result@lab:var(x));
else if(propertyFetch(var(name(name(str x))),name(name(str y))):=result)
mapp +=(result@lab: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;
我担心的是变量&#34;结果&#34;:var(名称(名称(&#34; alpha&#34;)))[@ at = ...]的输出表明存在注释@lab附带变量。为什么我无法找回它?另外,如果可能的话,我该如何检索它呢?
答案 0 :(得分:0)
原因可能是几件事。
value
,这还不够具体。我不知道为什么在你的例子中发生了这种情况,因为并未给出所有细节。很可能getElementFromSingletonList返回value
?我使用result[0]
或编写一个类型参数化函数,它返回元素的类型:&T get([&T elem]) = elem;
anno int MyExpressionType@lab;
或anno int node@label;
。这只能针对node
类型或已定义的data
类型执行。因此,当@
的接收者输入良好并且声明了标注时,它将按预期工作:
data MyExp = bla();
anno int MyExp@label;
MyExp example = bla()[@label=1];
println(example@label); // prints 1