2011-10-27 54 views
5

我正在为我正在制作的游戏开发一些工具。这些工具可以作为编辑游戏文件的前端。几个文件是python脚本文件。举例来说,我有一个包含以下(minimalized例如)从C操作Python文件#

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)) 

正如我所说,我想为编辑这个文件,而无需requring编辑器来了解Python /编辑提供一个前端的Items.py文件该文件直接。我的编辑需要能够:

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

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

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

有没有一些明显的解决方案,我没有看到?我应该继续研究解析器并使其支持更复杂的数据类型吗?尽管我已经使用过IronPython解析器,但我没有考虑将修改过的数据重新放入文件中有多棘手。

任何建议,将不胜感激

回答

1

你想要一个源到源program transformation tool

这样的工具将语言解析为内部数据结构(总是AST),允许您修改AST,然后可以从修改后的AST中重新生成源文本,而不必更改基本上任何关于源的内容,除非AST更改做了。

这样的程序转换工具必须将文本解析为AST,将“anti-parse”(称为“Prettyprint”)AST解析为文本。如果IronPython有一个漂亮的打印机,那就是你需要的。 如果没有,你可以用一些(也许很多)努力来构建一个;正如你所观察到的,这并不像人们想象的那么容易。见我的回答 Compiling an AST back to source code

如果不行,我们DMS Software Reengineering ToolkitPython front end可能做的伎俩。它具有所有上述属性。

0

只要你能找到一个用于Python的完整和最新上下文无关文法文件,你可以使用CoCo/R解析器生成器生成的C#一个python解析器。

您可以将生产代码添加到语法文件本身,以填充C#应用程序中的数据结构。所述数据结构可以容纳你需要的所有信息(方法及其参数,属性,构造函数,析构函数等)。一旦你有了这个数据结构,它只是一个为用户设计一个前端的任务,并以一种使它可编辑的方式来表示这个数据结构(这更多的是设计任务,而不是复杂的编程任务)。

最后,遍历你的数据结构并写出一个.py文件。

0

您可以使用python inspect模块来打印对象的来源。在你的情况下:打印你的模块的源代码 - 你刚刚用IronPython解析的文件。尽管如此,我还没有检查过是否可以使用IronPython进行检测。

至于添加东西,那么,它是一个模块,对吧?你可以添加东西到一个模块...我会加载模块,然后改变它,使用inspect来查看打印它并保存到磁盘。

从您的文章,它看起来就像你在战壕和玩乐已深,所以我真的很高兴在这里见到你如何解决这个问题后!

0

对我来说,听起来更像是你将它全部推到一个sqlite数据库并开始编辑它。连接一些表单来编辑表格对于UI来说更简单。此时,您可以通过以某种格式转储表来生成新的python文件,以提供周围的python脚本。

SVN/Git的/任何可以合并通过Python文件的更新变化。

这是我落得这样做对我在任何速度的项目。我开始使用Python挂钩使用他们的计算按键的各个项目,然后只是增加了一些形式的UI,以避免在Python文件编辑错误。