6

Luaテーブルの形式のデータがたくさんあり、そのデータをC#で使用可能な構造に解析したいと思います。

Luaテーブルの問題は、オプションのフィールドがあり、テーブルは非常に動的であり、キー用に1つのタイプ、値用に1つのタイプを持つ単なるディクショナリではないことです。文字列キーと整数キーの両方、および整数、文字列、さらにはテーブルのタイプの値を持つ1つのLuaテーブルを持つことができます。

残念ながら、私が解析しているデータは、言語の動的な性質を利用しており、実際には単純な方法で構造化されていません。これには、たとえばを使用して、データを動的に表現する必要がありますDictionary<object, dynamic>

データの形式は次のとおりです(http://ideone.com/9nzXvtから)

local mainNode =
{
    [0] = 
        {
            Name = "First element",
            Comments = "I have comments!",
            Data = { {123, 456}; foo = { "bar" } }
        },
    [1337] =
        {
            Name = "Another element",
            Data = { {0}; foo = nil }
        }
}

これを行うためのライブラリはありますか?データを文字ごとに解析せずにこれを実現する方法はありますか?

4

2 に答える 2

3

luainterfaceライブラリを使用できます

ここにいくつかのサンプルコードがあります。

DoFile(ファイルをロードするために)と、c#の結果を使用できるオブジェクトGetTableにテーブルを読み込むための組み合わせを使用する必要があります。LuaTableを公​​開LuaTableIDictionaryEnumeratorますGetEnumerator

編集:

このテーブルコンストラクターがある場合:

local t = { os.time() }
print(t[1]);

データを初期化するには、コンストラクターの関数を実行する必要があります。

定数リテラルの場合、次のような文字列定数を使用できます。

local a = [==[
  hello
  there""\"]==]

等号のレベルが異なる

数値リテラルの形式は次のとおりです。

0X1.921FB54442D18P+1

Pを2進指数として使用します。

軽量のluaVMを使用せずに定数リテラルのlua構文を忠実に再現するには、lua言語仕様の適切なチャンクを再実装する必要があります。車輪の再発明にはあまりメリットがありません。

于 2012-11-04T15:50:56.557 に答える
2

これは古い投稿ですが、この投稿の後にここに到着する人には役立つかもしれません...

XanatharのMoonSharp(Moon#)プロジェクトも見ることができます。私はそれを試し始めたばかりで、動的テーブルやネストされたテーブルなどをラップするのにうまくいくようです。インタプリタにスクリプトを与えるだけで、解析されたオブジェクトがインタプリタコンテキストで解析および保持されます。

リンク:

例:

[TestMethod]
    public void Test_GetProperty_ForValidTypeAndKey_ReturnsValue()
    {
        // Arrange
        String luaScript = MockLuaScripts.TEST_OBJECT_WITH_STRING;
        Script context = new Script();
        String expectedResult = MockLuaScripts.ValidValue1;

        // Act
        /* Run the script */
        context.DoString(luaScript);

        /* Get the object */
        DynValue resultObject = context.Globals.Get(MockLuaScripts.ObjectInstance1);

        /* Get the property */
        DynValue tableValue = instance.Table.Get((MockLuaScripts.ValidKey1);
        String actualResult = tableValue.String();

        /* Or you can use..
            String actualResult = tableValue.ToObject<String>();
        */

        // Assert 
        Assert.AreEqual(expectedResult, actualResult);
    }

上記のコードが私のテストクラスの1つから取得され、ここに投稿するために変換されたため、正確に正しくない場合はお詫びします。ラップされたモックデータ定数を許してください、しかしそれらは本質的にLuaスクリプトと期待値です。

間違ったキーを介してLuaテーブルのエントリにアクセスしようとすると、DynValueのDataTypeは「Nil」であるため、条件付きチェックで簡単に処理できます。

XanatharのMoonsharpの使用に関するその他の例は、XanatharのWebサイトと彼のgitハブリポジトリにあります。(以下のリンクを参照してください)。彼はあなたが遭遇するかもしれないどんな問題や質問にも非常に役立つようです。

リンク:

私は自分のリポジトリの1つでさらなる使用法を示すユニットテストを持ついくつかの拡張機能を書き始めました(以下のリンクを参照)

リンク:

于 2014-10-22T06:56:26.313 に答える