Rascal:get-annotation不支持值,当显然,有一个相应的@lab注释

时间:2015-01-29 19:30:39

标签: rascal

这是控制台的输出,

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附带变量。为什么我无法找回它?另外,如果可能的话,我该如何检索它呢?

1 个答案:

答案 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