高效地从文本文件中读取代码以及如何区分文本文件中的代码块

Reading Code From a Text File Efficiently And How to Distinguish Blocks of Code In The Text File

我正在为一款游戏创建一个实用程序,它通过读取游戏代码来创建数据电子表格。

最基本的方面之一是能够有效地阅读游戏代码。该游戏是用 C# 编写的。我正在为我的程序使用 VB.Net,因为我的头脑无法理解更复杂语言的抽象。从历史上看,我让我的程序识别代码文本文件中的代码块的方法是计算封装它们的括号并处理它们。不过,这似乎有点笨拙。有没有更简单的方法帮助程序找出代码块?

例如,文本文件中的代码可能如下所示:

6673={
    key="d_example_duchy_1"
    de_facto_liege=12
    variables={
        data={ {
                flag="traditional_de_jure_kingdom"
                tick=0
                data={
                    type=lt
                    identity=6632
                }
            }
 }
    }
    de_jure_liege=6632
    de_jure_vassals={ 6674 6678 6682 6686 }
    holder=558
    name="Example Duchy 1"
    date=1253.1.1
    heir={ 880 }
    history={ 1253.1.1=558 }
    capital=6674
    history_government="tribal_government"
    coat_of_arms_id=2320
}
6674={
    key="c_example_county_1"
    variables={
        data={ {
                flag="influx_culture"
                tick=0
                data={
                    type=culture
                    identity=11
                }
            }
 {
                flag="influx_faith"
                tick=0
                data={
                    type=faith
                    identity=57
                }
            }
 {
                flag="fog_resistance"
                tick=0
                data={
                    type=value
                }
            }
 }
    }
    de_jure_liege=6673
    de_jure_vassals={ 6675 6676 6677 }
    holder=558
    name="Example County 1"
    date=1243.6.26
    heir={ 880 }
    capital=6674
    coat_of_arms_id=2323
}
6675={
    key="b_example_barony_1"
    de_facto_liege=6674
    de_jure_liege=6674
    holder=558
    name="Example Barony 1"
    date=1254.1.1
    capital_barony=yes
    duchy_capital_barony=yes
    capital=6674
    coat_of_arms_id=2328
}
6676={
    key="b_example_barony_2"
    de_facto_liege=6674
    de_jure_liege=6674
    holder=11609
    name="Example Barony 2"
    date=1253.7.28
    capital=6674
    coat_of_arms_id=2332
}
6677={
    key="b_example_barony_3"
    de_facto_liege=6674
    de_jure_liege=6674
    holder=558
    name="Example Barony 3"
    date=1232.2.8
    heir={ 880 }
    capital=6674
    theocratic_lease=yes
    coat_of_arms_id=2334
}

提前致谢。 :)

我最终确定的解决方案,用于识别整体代码块(例如,嵌套在 6674={ ... } 下的所有数据)基本上是:

Dim Code As String = File.ReadAllText("PATH/TO/CODE/FILE.txt")
Dim Output As List(Of String) = Code.Split(vbCrLf & "}" & vbCrLf).ToList

所以在简单的英语中,将所有代码读入一个字符串,然后根据原始代码的语言如何区分字符串 initial 代码嵌套(即回车return 后跟一个大括号,然后是另一个回车 return).

最后的列表看起来像这样:

输出(0)

6673={" & vbCrLf & "    key=""d_example_duchy_1""" & vbCrLf & "    de_facto_liege=12" & vbCrLf & "    variables={" & vbCrLf & "        data={ {" & vbCrLf & "                flag=""traditional_de_jure_kingdom""" & vbCrLf & "                tick=0" & vbCrLf & "                data={" & vbCrLf & "                    type=lt" & vbCrLf & "                    identity=6632" & vbCrLf & "                }" & vbCrLf & "            }" & vbCrLf & " }" & vbCrLf & "    }" & vbCrLf & "    de_jure_liege=6632" & vbCrLf & "    de_jure_vassals={ 6674 6678 6682 6686 }" & vbCrLf & "    holder=558" & vbCrLf & "    name=""Example Duchy 1""" & vbCrLf & "    date=1253.1.1" & vbCrLf & "    heir={ 880 }" & vbCrLf & "    history={ 1253.1.1=558 }" & vbCrLf & "    capital=6674" & vbCrLf & "    history_government=""tribal_government""" & vbCrLf & "    coat_of_arms_id=2320

输出(1)

6674={" & vbCrLf & "    key=""c_example_county_1""" & vbCrLf & "    variables={" & vbCrLf & "        data={ {" & vbCrLf & "                flag=""influx_culture""" & vbCrLf & "                tick=0" & vbCrLf & "                data={" & vbCrLf & "                    type=culture" & vbCrLf & "                    identity=11" & vbCrLf & "                }" & vbCrLf & "            }" & vbCrLf & " {" & vbCrLf & "                flag=""influx_faith""" & vbCrLf & "                tick=0" & vbCrLf & "                data={" & vbCrLf & "                    type=faith" & vbCrLf & "                    identity=57" & vbCrLf & "                }" & vbCrLf & "            }" & vbCrLf & " {" & vbCrLf & "                flag=""fog_resistance""" & vbCrLf & "                tick=0" & vbCrLf & "                data={" & vbCrLf & "                    type=value" & vbCrLf & "                }" & vbCrLf & "            }" & vbCrLf & " }" & vbCrLf & "    }" & vbCrLf & "    de_jure_liege=6673" & vbCrLf & "    de_jure_vassals={ 6675 6676 6677 }" & vbCrLf & "    holder=558" & vbCrLf & "    name=""Example County 1""" & vbCrLf & "    date=1243.6.26" & vbCrLf & "    heir={ 880 }" & vbCrLf & "    capital=6674" & vbCrLf & "    coat_of_arms_id=2323

以此类推剩下的三个。