从C#操作Python文件

Meg*_*ron 5 c# python parsing ironpython

我正在为我正在制作的游戏开发一些工具.这些工具可以作为使编辑游戏文件更容易的前端.其中一些文件是python脚本文件.例如,我有一个Items.py文件,其中包含以下内容(例如,最小化)

from ItemModule import *

import copy

class ScriptedItem(Item):
    def __init__(self, name, description, itemtypes, primarytype, flags, usability, value, throwpower):
        Item.__init__(self, name, description, itemtypes, primarytype, flags, usability, value, throwpower, Item.GetNextItemID())
    def Clone(self):
        return copy.deepcopy(self)

ItemLibrary.AddItem(ScriptedItem("Abounding Crystal", "A colourful crystal composed of many smaller crystals. It gives off a warm glow.", ItemType.SynthesisMaterial, ItemType.SynthesisMaterial, 0, ItemUsage.Unusable, 0, 50))
Run Code Online (Sandbox Code Playgroud)

正如我提到的,我想提供一个前端来编辑这个文件,而不需要编辑器直接知道python /编辑文件.我的编辑需要能够:

  1. 查找并列出所有类类型(在此示例中,它只是脚本项)
  2. 查找并列出所有创建的项目(在这种情况下,只有一个,Abounding Crystal).我需要找到类型(在本例中为ScriptBelptedItem)和所有参数值
  3. 允许编辑参数和创建/删除项目.

为此,我开始编写自己的解析器,查找类关键字以及何时使用这些记录的类来构造对象.这适用于简单的数据,但是当我开始使用具有复杂构造函数的类(列表,映射等)时,正确解析变得越来越困难.

在搜索之后,我发现IronPython可以很容易地解析python文件,所以这就是我要做的事情.一旦我构建了抽象语法树,我就使用PythonWalkers来识别和查找我需要的所有信息.这非常适合读取数据,但我没有看到将更新的数据推送到Python文件的简单方法.据我所知,没有办法改变AST中的值,更不用说将AST转换回脚本文件了.如果我错了,我会喜欢有人告诉我如何做到这一点.我现在需要做的是搜索文件直到找到正确的行,然后尝试将数据推送到构造函数中,确保正确的排序.

我有没有看到一些明显的解决方案?我应该继续处理我的解析器并使其支持更复杂的数据类型吗?我真的虽然我使用了IronPython解析器,但我没想到将修改后的数据推回文件是多么棘手.

任何建议,将不胜感激

Ira*_*ter 1

您需要一个源到源程序转换工具

此类工具将语言解析为内部数据结构(始终是 AST),允许您修改 AST,然后可以从修改后的 AST 重新生成源文本,而无需更改源的任何内容(除了进行 AST 更改的位置之外)。

这样的程序转换工具必须将文本解析为 AST,并将 AST“反解析”(称为“Prettyprint”)解析为文本。如果 IronPython 有一个漂亮的打印机,那么这就是您所需要的。如果没有,您可以花费一些(可能是很多)努力来构建一个;正如您所观察到的,这并不像人们想象的那么容易。请参阅我的回答 将 AST 编译回源代码

如果这不起作用,我们的DMS 软件重组工具包及其Python 前端可能会解决问题。它具有以上所有属性。