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) で発生する可能性のある多くのタイプのステートメントの 1 つです。なぜこれを行うのかを説明せずに、上記のコードが機能しないのはなぜですか? 非常に単純な例がオンラインドキュメントで解決されているため、特にイライラします. 参照: http://tutor.rascal-mpl.org/Recipes/Basic/Basic.html#/Recipes/Common/CountConstructors/CountConstructors.html

4

2 に答える 2

0

ほとんどの場合、エラーの直接の原因となるidstype を持つ名前が既にスコープ内にありました。関数map[str,int]でスクリプトhttps://github.com/cwi-swat/php-analysis/blob/master/src/lang/php/analysis/cfg/LabelState.rsclabelScriptを調べて、PHP AirR でこれがどのように行われるかを確認できます。 (したがって、このコードを自分で記述する必要はありません)。これにより、すべての式とステートメントに割り当てられた ID と、このラベル付け操作で使用される情報 (主に一意の ID を生成するためのカウンター) を追跡するラベルの状態を持つスクリプトが得られます。

以前の回答と同様に、最善の方法は、インポートできるモジュールで定義を提供することです。これを行うと、型などへの変更が反映されます (モジュールが既にインポートされている場合は自動的に、モジュールが変更されていれば Rascal がモジュールを再インポートするため、または次にモジュールをインポートするときに)。ただし、コンソールで何かを直接定義すると、これは発生しません。コンソールは、追加し続ける 1 つの大きなモジュールと考えてください。関数のオーバーロードを使用できるため、関数を再度定義すると、実際には関数の新しい代替を定義することになりますが、これは期待どおりに機能しない可能性があります。

于 2014-11-04T18:27:38.630 に答える