【发布时间】:2015-10-02 18:44:12
【问题描述】:
我将为指定的编程语言和指定的序列化格式创建一个数据绑定代码生成器:给定要序列化或反序列化的数据结构的规范,预期的代码生成器应该生成表示给定词汇表的类(使用指定的编程语言)以及使用指定格式进行序列化和反序列化的方法。预期的代码生成器可能需要以下输入:
- 目标编程语言,即生成代码的编程语言;
- 目标序列化格式,即数据的序列化格式;
- 要序列化或反序列化的数据结构规范。
由于最初我想创建一个简单的代码生成器,这个软件的第一个版本可能只需要定义要序列化或反序列化的数据结构的规范,所以我选择 C# 作为目标编程语言和 XML 作为目标序列化格式。 本质上,预期的代码生成器应该是一个 Java 软件,它读取要序列化或反序列化的数据结构规范(该规范必须根据给定的语法编写),并生成表示给定词汇表的 C# 类:这些类应该具有 XML 格式的序列化和反序列化方法。预期代码生成器的目的是生成一个或多个类,以便它们可以嵌入到 C# 项目中。
关于要序列化或反序列化的数据结构的规范,可以定义如下:
simple type Message: int id, string content
根据上面示例中的规范,预期的代码生成器可以生成以下 C# 类:
public class Message
{
public int Id { get; set; }
public string Content { get; set; }
public byte[] Serialize()
{
// ...
}
public void Deserialize(byte[] data)
{
// ...
}
}
我读到了ANTLR,我相信这个工具非常适合刚刚解释的目的。正如this answer 中解释的那样,我应该首先为要序列化或反序列化的数据结构的规范创建一个语法。
上面的例子很简单,因为它只定义了一个简单类型,但是数据结构的规范可能更复杂,所以我们可以有一个复合类型,它包含一个或多个简单类型或列表等,如下例所示:
simple type LogInfo: DateTime time, String message
simple type LogSource: String class, String version
compound type LogEntry: LogInfo info, LogSource source
此外,数据规范还可以包括一个或多个约束,如下例所示:
simple type Message: int id (constraint: not negative), string content
在这种情况下,预期的代码生成器可以生成以下 C# 类:
public class Message
{
private int _id;
private string _content;
public int Id
{
get { return _id; }
set
{
if (value < 0)
throw new ArgumentException("...");
_id = value;
}
}
public string Content
{
get { return _content; }
set { _content = value; }
}
public byte[] Serialize()
{
// ...
}
public void Deserialize(byte[] data)
{
// ...
}
}
基本上,预期的代码生成器应该找到所有用户定义的类型、任何约束等。有一些简单的例子吗?
【问题讨论】:
-
我会警惕重新发明这个特殊的轮子。
标签: java parsing compiler-construction antlr antlr4