50 lines
1.5 KiB
C#
50 lines
1.5 KiB
C#
using System;
|
|
using System.IO;
|
|
using System.Diagnostics;
|
|
using System.Text;
|
|
using System.Reflection;
|
|
using System.Reflection.Emit;
|
|
using System.Windows.Forms;
|
|
using System.Threading;
|
|
|
|
public class demo {
|
|
[STAThread]
|
|
public static void Main(string[] args) {
|
|
Form form = new Form1();
|
|
c = new Compiler(reader, Console.Error);
|
|
c.LoadVisitor("bind");
|
|
c.LoadVisitor("typecheck");
|
|
c.LoadVisitor("rewrite");
|
|
c.LoadVisitor("emit");
|
|
c.AddVisitor(typeof (demo));
|
|
Application.Run(form);
|
|
}
|
|
static AssemblyBuilder asm = null;
|
|
static ReflectionReader reader = new ReflectionReader();
|
|
static Compiler c = null;
|
|
public static AssemblyBuilder Compile(string code) {
|
|
c.Msg.Count = 0;
|
|
asm = null;
|
|
int count = c.Compile(new StringReader(code), Console.Out, new string[] {});
|
|
if (count == 0 && asm != null) {
|
|
reader.Load(asm);
|
|
return asm;
|
|
}
|
|
return null;
|
|
}
|
|
public static void Run(AssemblyBuilder asm) {
|
|
MethodInfo m = asm.EntryPoint.DeclaringType.GetMethod(asm.EntryPoint.Name);
|
|
try {
|
|
if (m != null)
|
|
m.Invoke(null, null);
|
|
} catch (Exception e) {
|
|
Console.Error.WriteLine("{0}", e.ToString());
|
|
}
|
|
}
|
|
public static compilation visit(compilation ast, TextWriter w, string[] args, MessageWriter msg) {
|
|
if (msg.Count == 0)
|
|
asm = (AssemblyBuilder)ast;
|
|
return ast;
|
|
}
|
|
}
|