0

这更像是一个简单的个人尝试,以了解 Rascal 内部发生的事情。必须有更好的(如果尚未支持)解决方案。这是代码:

fileLoad = |home:///PHPAnalysis/systems/ApilTestScripts/simple1.php|;
fileAST=loadPHPFile(fileLoad,true,false);

//assign a simple id to each node
public map[value,int] assignID12(node N)
{
    myID=();
    visit(N)
    {
        case node M:
        {
            name=getName(M);
            myID[name] =999;

        }
    }
return myID;
}

ids=assignID12(fileAST);

给我

|stdin:///|(92,4,<1,92>,<1,96>): Expected str, but got value 

loadPHPFile 返回一个类型为:list[Stmt] 的节点,其中每个 Stmt 都是程序中可能出现的多种语句之一(在我的例子中是 PHP)。不谈为什么我会这样做,为什么上面的代码不起作用?尤其令人沮丧,因为在线文档中提供了一个非常简单的示例。请参阅:http ://tutor.rascal-mpl.org/Recipes/Basic/Basic.html#/Recipes/Common/CountConstructors/CountConstructors.html

4

2 回答 2

0

我启动了一个新控制台,它似乎可以工作。当然,我将返回类型从 map[value,int] 更改为 map[str,int] ,因为它最初在示例中。

我遇到的问题是我之前可能错误地定义了该函数。虽然我很快解决了一个明显的问题,但它一直给我错误。我意识到在 Rascal 中,当您启动控制台并导入某些定义时,(似乎)不可能覆盖这些定义。解释器不断引用您提供的第一个定义。这可能只是解释器执行类型检查,并在以后防止无意和/或不兼容的分配。这对变量有意义(在典型的程序意义上),但在函数(或方法)上强制执行它似乎不是最好的主意。我觉得它变得很麻烦,因为用户通常必须经过一些迭代才能对函数定义感到满意。虽然只是我的意见...

于 2014-11-04T18:00:01.737 回答
0

很可能您已经ids在范围内拥有 type的名称map[str,int],这将是错误的直接来源。您可以在脚本https://github.com/cwi-swat/php-analysis/blob/master/src/lang/php/analysis/cfg/LabelState.rsc中查看该函数labelScript,以了解这是如何在 PHP AiR 中完成的(因此您不需要自己编写此代码)。这将为您提供一个脚本,其中所有表达式和语句都有一个分配的 ID,以及标签状态,它只跟踪此标签操作中使用的一些信息(主要是生成唯一 ID 的计数器)。

至于较早的响应,最好的办法是在您可以导入的模块中给出您的定义。如果你这样做,对类型等的任何更改都会被拾取(如果模块已经导入,则会自动进行,因为如果模块发生了变化,或者当你下次导入模块时,Rascal 会为你重新导入模块)。但是,如果您直接在控制台中定义某些内容,则不会发生这种情况。将控制台视为您不断添加的一个大模块。因为我们可以有函数的重载,如果你再次定义这个函数,你实际上是在定义一个新的替代函数,但这可能不会像你期望的那样工作。

于 2014-11-04T18:27:38.630 回答