0231124/CodeGen
/CodeGen/CodeGen/CodeGen/CodeGenerator.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using CodeGen.CodeGenerator;
namespace CodeGen
{
class Program
{
static void Main(string[] args)
{
var codeGen = new CodeGenerator();
//codeGen.GenerateCode();
codeGen.GenerateCodeWithArgs(args);
}
}
}
/CodeGen/CodeGen/CodeGenerator/CodeGenerator.cs
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using CodeGen.CodeGenerator;
using CodeGen.CodeGenerator.Visitor;
using CodeGen.CodeGenerator.Visitor.Visitor;
using CodeGen.CodeGenerator.Visitor.VisitorBase;
using CodeGen.CodeGenerator.Visitor.VisitorSpecific;
using CodeGen.CodeGenerator.Visitor.VisitorType;
using CodeGen.CodeGenerator.Visitor.VisitorTypeBase;
using CodeGen.CodeGenerator.Visitor.VisitorTypeSpecific;
using CodeGen.CodeGenerator.Visitor.VisitorTypeSpecificBase;
using CodeGen.CodeGenerator.Visitor.VisitorTypeSpecificType;
namespace CodeGen
{
public class CodeGenerator
{
private Dictionary<string, CodeGeneratorVisitor> _visitorTypeMap;
public CodeGenerator()
{
_visitorTypeMap = new Dictionary<string, CodeGeneratorVisitor>();
}
public void GenerateCodeWithArgs(string[] args)
{
// 解析命令行参数
var options = ParseOptions(args);
// 创建适当的根节点
var root = CreateRootNode(options);
// 遍历节点生成代码
GenerateCode(root);
}
private Options ParseOptions(string[] args)
{
var options = new Options();
var optionIndex = 0;
while (optionIndex < args.Length)
{
var option = args[optionIndex];
if (option.StartsWith("/"))
{
if (option.Equals("/help", StringComparison.OrdinalIgnoreCase))
{
PrintUsage();
return options;
}
else if (option.Equals("/version", StringComparison.OrdinalIgnoreCase))
{
Console.WriteLine("CodeGen Version 1.0");
return options;
}
else if (option.Equals("/output", StringComparison.OrdinalIgnoreCase))
{
optionIndex++;
if (optionIndex < args.Length)
{
options.OutputFileName = args[optionIndex++];
}
}
}
else
{
optionIndex++;
}
}
return options;
}
private void GenerateCode(Node root)
{
if (root is CodeGeneratorVisitor visitor)
{
visitor.Visit(root);
}
}
private Node CreateRootNode(Options options)
{
if (options.OutputFileName != null)
{
return new OutputNode(options.OutputFileName);
}
else
{
return new DefaultNode();
}
}
public void GenerateCode()
{
var root = CreateRootNode(null);
GenerateCode(root);
}
}
}
/CodeGen/CodeGen/CodeGenerator/Visitor/VisitorType/VisitorTypeBase.cs
using System;
using System.Collections.Generic;
using System.Text;
using CodeGen.CodeGenerator.Visitor.VisitorType;
using CodeGen.CodeGenerator.Visitor.VisitorTypeSpecific;
using CodeGen.CodeGenerator.Visitor.VisitorTypeSpecificBase;
using CodeGen.CodeGenerator.Visitor.VisitorTypeSpecificType;
using CodeGen.CodeGenerator.Visitor.VisitorTypeSpecificTypeSpecific;
using CodeGen.CodeGenerator.Visitor.VisitorTypeSpecificTypeSpecificBase;
using CodeGen.CodeGenerator.Visitor.VisitorTypeSpecificTypeSpecificType;
namespace CodeGen.CodeGenerator.Visitor.VisitorType
{
public abstract class VisitorTypeBase<T, TVisitor> : VisitorTypeSpecificBase<T, TVisitor, T>
{
public abstract void Visit(TVisitor visitor);
}
}
/CodeGen/CodeGen/CodeGenerator/Visitor/VisitorType/VisitorTypeSpecificTypeSpecificTypeSpecific.cs
using System;
using System.Collections.Generic;
using System.Text;
using CodeGen.CodeGenerator.Visitor.VisitorType;
using CodeGen.CodeGenerator.Visitor.VisitorTypeSpecific;
using CodeGen.CodeGenerator.Visitor.VisitorTypeSpecificBase;
using CodeGen.CodeGenerator.Visitor.VisitorTypeSpecificType;
using CodeGen.CodeGenerator.Visitor.VisitorTypeSpecificTypeSpecific;
using CodeGen.CodeGenerator.Visitor.VisitorTypeSpecificTypeSpecificBase;
using CodeGen.CodeGenerator.Visitor.VisitorTypeSpecificTypeSpecificType;
namespace CodeGen.CodeGenerator.Visitor.VisitorTypeSpecificTypeSpecificTypeSpecific
{
public class VisitorTypeSpecificTypeSpecificTypeSpecific<T> : VisitorTypeSpecificTypeSpecificBase<T, VisitorTypeSpecificTypeSpecificTypeSpecific<T>, VisitorTypeSpecificTypeSpecificTypeSpecific<T>>
{
public override void Visit(VisitorTypeSpecificTypeSpecificBase<T, VisitorTypeSpecificTypeSpecificTypeSpecific<T>, VisitorTypeSpecificTypeSpecificTypeSpecific<T>> visitor)
{
// This is a placeholder. The actual implementation is left to the derived class.
}
}
}
/CodeGen/CodeGen/CodeGenerator/Visitor/VisitorType/VisitorTypeSpecificTypeSpecificTypeSpecificBase.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using CodeGen.CodeGenerator.Visitor.VisitorType;
using CodeGen.CodeGenerator.Visitor.VisitorTypeSpecific;
using CodeGen.CodeGenerator.Visitor.VisitorTypeSpecificBase;
using CodeGen.CodeGenerator.Visitor.VisitorTypeSpecificType;
using CodeGen.CodeGenerator.Visitor.VisitorTypeSpecificTypeSpecific;
using CodeGen.CodeGenerator.Visitor.VisitorTypeSpecificTypeSpecificBase;
using CodeGen.CodeGenerator.Visitor.VisitorTypeSpecificTypeSpecificType;
namespace CodeGen.CodeGenerator.Visitor.VisitorTypeSpecificTypeSpecificTypeSpecific