User:Feuermonster/Brainpiler
Jump to navigation
Jump to search
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.CodeDom.Compiler;
namespace Brainpiler
{
class Program
{
static void Main(string[] args)
{
if (args.Length < 1)
{
System.Console.WriteLine("brainpiler <file>");
System.Environment.Exit(-1);
}
string code = System.IO.File.ReadAllText(args[0]);
List<String> cs_code = new List<string>();
cs_code.Add("namespace bf { ");
cs_code.Add("public class Brainfuck {");
cs_code.Add(" public static void Main(string[] args) {");
cs_code.Add("byte[] tape = new byte[30000]; int ptr = 15000;");
for (int i = 0; i < code.Length; i++)
{
switch (code[i])
{
case '+':
cs_code.Add("if (tape[ptr] == byte.MaxValue)");
cs_code.Add("tape[ptr] = 0;");
cs_code.Add("else");
cs_code.Add(" tape[ptr]++;");
break;
case '-':
cs_code.Add("if (tape[ptr] == 0)");
cs_code.Add("tape[ptr] = byte.MaxValue;");
cs_code.Add("else");
cs_code.Add("tape[ptr]--;");
break;
case '<':
cs_code.Add("if (ptr == 0)");
cs_code.Add("ptr = tape.Length - 1;");
cs_code.Add("else");
cs_code.Add("ptr--;");
break;
case '>':
cs_code.Add("if (ptr == tape.Length - 1)");
cs_code.Add("ptr = 0;");
cs_code.Add("else");
cs_code.Add("ptr++;");
break;
case '[':
cs_code.Add("while(tape[ptr] != 0) {");
break;
case ']':
cs_code.Add("}");
break;
case '.':
cs_code.Add("System.Console.Write(((char)tape[ptr]).ToString());");
break;
case ',':
cs_code.Add("tape[ptr] = (byte)System.Console.ReadKey().KeyChar;");
break;
}
}
cs_code.Add(" } ");
cs_code.Add("}");
cs_code.Add("}");
string caa = "";
foreach (string str in cs_code)
{
caa += str + "\n";
}
Microsoft.CSharp.CSharpCodeProvider c = new Microsoft.CSharp.CSharpCodeProvider();
String[] referenceAssemblies = { "System.dll" };
CompilerParameters cp = new CompilerParameters(referenceAssemblies, "compiled.exe", false);
// Generate an executable rather than a DLL file.
cp.GenerateExecutable = true;
System.CodeDom.Compiler.CompilerResults cr = c.CompileAssemblyFromSource(cp, caa);
foreach(System.CodeDom.Compiler.CompilerError ce in cr.Errors) {
Console.WriteLine(ce.ErrorText + " line: " + ce.Line.ToString() + " str: " + ce.ToString() );
Console.WriteLine("which is: " + cs_code[ce.Line]);
}
System.Reflection.Assembly a = cr.CompiledAssembly;
}
}
}