【问题标题】:Is there an easy way to generate code from a text file?有没有一种从文本文件生成代码的简单方法?
【发布时间】:2011-01-26 01:29:43
【问题描述】:

我目前正在开展一个项目,该项目使用大量硬编码内存位置访问硬件。这些位置可以根据电气工程师的突发奇想而改变,所以我希望从工程师的内存映射中生成代码。假设地图是一个简单的文本文件,例如:

Name, Type, Address, Description
Foo, int, A001, Foo integer variable
Bar, float, A002, Bar float variable

我想自动生成类似于以下的代码(不是 IL):

class MachineMap
{
  /// <summary>
  /// Foo integer variable
  /// </summary>
  public readonly Addressable<int> Foo = new Addressable<int>("A001");
  /// <summary>
  /// Bar float variable
  /// </summary>
  public readonly Addressable<float> Bar = new Addressable<float>("A002");
}

是否有人对可以使这项任务变得容易或更容易的工具有想法?

【问题讨论】:

  • 我不明白,为什么你需要的不仅仅是 StreamWriter?
  • 上面的例子非常幼稚。我有许多不同类型的可寻址类,并想建立一些层次结构; .e.g MachineMap.Arm1.Sensor1.Value 等

标签: .net code-generation


【解决方案1】:

看看 Visual Studio 的内置代码生成能力,称为 T4。 或者另一种选择可能是商业产品,例如CodeSmith

看看 Scott Hanselman 的这篇文章:
T4 (Text Template Transformation Toolkit) Code Generation - Best Kept Visual Studio Secret

【讨论】:

  • 您知道 T4 / CodeSmith 是否允许您从其他来源(例如 Excel 工作表)生成代码?
  • 感谢 Hanselman 链接。我正在查看 T4,但没有意识到您基本上可以编写任何 c# 代码作为模板的一部分。本教程与我正在尝试做的事情非常相关:aabs.wordpress.com/2008/06/26/…
【解决方案2】:

使用这样的正则表达式(使用gvimvim):

:%s/\(.*\), \(.*\), \(.*\), \(.*\)/public readonly Addressable<\2> \1 = new Addressable<\2>("\3")/g

这解决了主要的解析部分。然后将内容与页眉和页脚文件连接起来:

type header.txt converted.txt footer.txt > source.c

如果映射更复杂,则使用语法解析工具。否则,如果它真的那么简单,请避免为这么小的钉子使用水槽。

【讨论】:

  • +1 这和一些动态创建 Addressable 对象的反射,你就完成了。
【解决方案3】:

您也许可以制作您选择的 DSL,然后使用 M Grammar(Oslo 的一部分)对其进行解析。

【讨论】:

    【解决方案4】:

    类似于 Nick 的 Oslo 建议,StringTemplate 是另一种从定义良好的语法创建基于模板的源代码的方法。它有一个 C# 端口,因此很容易从 .NET 中使用。

    【讨论】:

      猜你喜欢
      • 2012-06-16
      • 2011-01-04
      • 1970-01-01
      • 1970-01-01
      • 2011-03-07
      • 2010-09-19
      • 1970-01-01
      • 2018-07-27
      • 2022-11-10
      相关资源
      最近更新 更多