2

我可以以某种方式使用具有以下内容的文本文件:

<comment> This is something like an XML file.
<action var="myInteger"> +50
<condition> stringVar == "sometext" <action var="boolVar"> = true

..解析它并让我的应用程序执行一些操作?

这个想法是制作一个用户友好的(示例不计算在内)伪代码,可以更改应用程序的变量和运行方法。问题是我不知道如何通过名称更改变量。

为每个变量名称单独设置一个案例(明确支持它们)将是相当疯狂的:

switch(varName)
{
    case "var1": {/* things */ break;}
    case "var2": {/* things */ break;}
    /* ... */
    case "var9999": {/* things */ break;}
}

编辑:我想我最初问错了问题。(还有一种简单的方法可以通过从文本文件中执行代码来处理应用程序的变量吗?

4

4 回答 4

1

回答你的问题:是的。

现在你已经编辑了你的问题......

您需要解析 XML,最好使用 .NET 附带的库。然后,您遍历 XML 树,执行每个与它相关联的操作的节点。

您可能不想直接公开应用程序的变量。相反,您应该定义一些可由 XML 文件操作的执行状态。例如,您可以拥有一个变量字典及其值。然后当你得到一个<action>标签时,你查看var属性,在字典中查找变量,然后将值更改为标签指定的任何内容。

这不是一项简单的任务。编写语言解释器并不一定很难(本质上就是你正在做的事情)。但是设计你的语言以使其有意义可能很困难。您还会发现,如果您有嵌入的表达式(您看起来是这样),那么您将需要一个表达式解析器。同样,这些“容易”构建,但对于没有经验的人,你需要先做一些研究。如果你不了解现实世界的解析技术,你很容易最终构建出非常复杂、缓慢和损坏的东西。

对于表达式解析,请查看 LL(1) 解析器,特别是递归下降,这是最容易理解和实现的。

为了评估 XML 输入,您需要一个遍历树的递归算法。这将类似于您的递归下降解析器。事实上,除了细节之外,两者几乎相同。

一旦你开始做某事,你应该问一个关于特定问题的实际问题,而不是问一个如此广泛的问题。

另一个编辑:为您的变量使用字典。

于 2012-10-24T02:34:15.113 回答
0

听起来像自定义配置部分会帮助你。看看http://haacked.com/archive/2007/03/11/custom-configuration-sections-in-3-easy-steps.aspx

于 2012-10-24T03:05:11.220 回答
0

对于一个非常简单的情况,您有一组固定的关键字/语法来定义操作,我建议您只编写一个自定义解析器并使用反射来访问您所定位的字段/属性和自定义代码实际操作。您可以利用 Action<> 和 Fun<> 委托来隔离/重用代码实现以实现具有明确评估路径的操作。

但是,如果您正在研究更复杂的场景,那么我建议您开始研究 DSL。我在 DSL 方面的知识非常有限,所以我不能说太多,但肯定会涉及到相当多的学习曲线。像meta#这样的东西可能是一个很好的起点,可以抽象出一些复杂性

于 2012-10-24T02:50:29.210 回答
0

我认为这对应用程序脚本非常有用,但是将所有应用程序变量绑定到脚本需要大量工作(更不用说学习一门新语言了)。

所以最好是使用 .NET 运行时编译功能,然后你的类 xml 文件应该是一个简单的 C# 文件,它将在运行时加载、编译和执行,更好的是你可以让它非常容易地引用你所有的应用程序变量。

于 2012-10-24T03:13:57.277 回答