有没有一种简单的方法可以从文本文件中生成代码?

9

我目前正在处理一个项目,该项目使用大量硬编码内存地址来访问硬件。这些地址可能会随着电气工程师的心血来潮而发生变化,因此我希望能够从工程师的内存映射中生成代码。假设该映射是一个简单的文本文件,如下所示:

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更多的东西? - Hans Passant
上面的例子相当幼稚。我有许多不同类型的可寻址类,并希望构建一些层次结构; 例如MachineMap.Arm1.Sensor1.Value等。 - Scott P
4个回答

4

你知道T4/CodeSmith是否允许你从其他来源生成代码,例如Excel表格吗? - Scott P
感谢提供的Hanselman链接。我一直在研究T4,但是没有意识到模板中可以写任何C#代码。这个教程与我正在尝试做的事情相关:http://aabs.wordpress.com/2008/06/26/state-machines-in-c-30-using-t4-templates/。 - Scott P

3

使用正则表达式来匹配文本(使用 gvimvim):

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

这解决了主要的解析部分。然后,您需要将内容与标题和页脚文件进行连接:
type header.txt converted.txt footer.txt > source.c

如果地图比较复杂,那么使用专门用于语法分析的工具。否则,如果真的很简单,就避免使用坦克来解决这样一个微小的问题。


+1 这样做并结合一些反射技术来动态创建 Addressable<> 对象,你就完成了。 - kenny

0

你可以尝试编写自己的领域特定语言(DSL),然后使用 M Grammar(Oslo的一部分)来解析它。


0

与尼克的奥斯陆建议类似,StringTemplate是另一种从明确定义的语法创建基于模板的源代码的方法。它有一个C#端口,因此可以很容易地从.NET中使用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接