using System;
using System.Reflection;
using System.Text.RegularExpressions;
namespace Q526265_MyAnswer2
{
class Program
{
static void RunProgram(string pascalProgram)
{
string className = "Program";
Func<string, string> pascalType2SharpType = pascalType =>
{
switch (pascalType)
{
case "integer":
return "int";
}
return "object";
};
var sharpProgram = Regex.Replace(pascalProgram, @"program (\w+);", m => { className = m.Groups[1].Value; return m.Result(@"
using System;
class $1 {
static void readln(ref int variable) {
variable = int.Parse(Console.ReadLine());
}
static void writeln(int value) {
Console.WriteLine(value);
}
"); });
sharpProgram = Regex.Replace(sharpProgram, @"var (.*): (\w+);", m => m.Result("static " + pascalType2SharpType(m.Groups[2].Value) + " $1;"));
sharpProgram = Regex.Replace(sharpProgram, @"readln\((\w+)\)", "readln(ref $1)");
sharpProgram = sharpProgram.Replace("begin", "static void Main() {").Replace("end.", "}}").Replace(":=", "=");
object programObject = new Microsoft.CSharp.CSharpCodeProvider()
.CompileAssemblyFromSource(new System.CodeDom.Compiler.CompilerParameters(), sharpProgram)
.CompiledAssembly.CreateInstance(className);
programObject.GetType().GetMethod("Main", BindingFlags.Static | BindingFlags.NonPublic).Invoke(null, null);
}
static void Main(string[] args)
{
RunProgram(@"
program test;
var a, b, c: integer;
begin
readln(a);
readln(b);
c := a + b;
writeln(c);
end.
");
RunProgram(@"
program MyProgram;
var a, b, c, d: integer;
begin
readln(a);
readln(b);
readln(d);
c := (a + b) / d;
writeln(c);
end.
");
}
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uUmVmbGVjdGlvbjsKdXNpbmcgU3lzdGVtLlRleHQuUmVndWxhckV4cHJlc3Npb25zOwoKbmFtZXNwYWNlIFE1MjYyNjVfTXlBbnN3ZXIyCnsKICAgIGNsYXNzIFByb2dyYW0KICAgIHsKICAgICAgICBzdGF0aWMgdm9pZCBSdW5Qcm9ncmFtKHN0cmluZyBwYXNjYWxQcm9ncmFtKQogICAgICAgIHsKICAgICAgICAgICAgc3RyaW5nIGNsYXNzTmFtZSA9ICJQcm9ncmFtIjsKICAgICAgICAgICAgRnVuYzxzdHJpbmcsIHN0cmluZz4gcGFzY2FsVHlwZTJTaGFycFR5cGUgPSBwYXNjYWxUeXBlID0+CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHN3aXRjaCAocGFzY2FsVHlwZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjYXNlICJpbnRlZ2VyIjoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJpbnQiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuICJvYmplY3QiOwogICAgICAgICAgICB9OwogICAgICAgICAgICB2YXIgc2hhcnBQcm9ncmFtID0gUmVnZXguUmVwbGFjZShwYXNjYWxQcm9ncmFtLCBAInByb2dyYW0gKFx3Kyk7IiwgbSA9PiB7IGNsYXNzTmFtZSA9IG0uR3JvdXBzWzFdLlZhbHVlOyByZXR1cm4gbS5SZXN1bHQoQCIKICAgICAgICAgICAgICAgIHVzaW5nIFN5c3RlbTsKICAgICAgICAgICAgICAgIGNsYXNzICQxIHsKICAgICAgICAgICAgICAgICAgICBzdGF0aWMgdm9pZCByZWFkbG4ocmVmIGludCB2YXJpYWJsZSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZSA9IGludC5QYXJzZShDb25zb2xlLlJlYWRMaW5lKCkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzdGF0aWMgdm9pZCB3cml0ZWxuKGludCB2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSh2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAiKTsgfSk7CiAgICAgICAgICAgIHNoYXJwUHJvZ3JhbSA9IFJlZ2V4LlJlcGxhY2Uoc2hhcnBQcm9ncmFtLCBAInZhciAoLiopOiAoXHcrKTsiLCBtID0+IG0uUmVzdWx0KCJzdGF0aWMgIiArIHBhc2NhbFR5cGUyU2hhcnBUeXBlKG0uR3JvdXBzWzJdLlZhbHVlKSArICIgJDE7IikpOwogICAgICAgICAgICBzaGFycFByb2dyYW0gPSBSZWdleC5SZXBsYWNlKHNoYXJwUHJvZ3JhbSwgQCJyZWFkbG5cKChcdyspXCkiLCAicmVhZGxuKHJlZiAkMSkiKTsKICAgICAgICAgICAgc2hhcnBQcm9ncmFtID0gc2hhcnBQcm9ncmFtLlJlcGxhY2UoImJlZ2luIiwgInN0YXRpYyB2b2lkIE1haW4oKSB7IikuUmVwbGFjZSgiZW5kLiIsICJ9fSIpLlJlcGxhY2UoIjo9IiwgIj0iKTsKCiAgICAgICAgICAgIG9iamVjdCBwcm9ncmFtT2JqZWN0ID0gbmV3IE1pY3Jvc29mdC5DU2hhcnAuQ1NoYXJwQ29kZVByb3ZpZGVyKCkKICAgICAgICAgICAgICAgIC5Db21waWxlQXNzZW1ibHlGcm9tU291cmNlKG5ldyBTeXN0ZW0uQ29kZURvbS5Db21waWxlci5Db21waWxlclBhcmFtZXRlcnMoKSwgc2hhcnBQcm9ncmFtKQogICAgICAgICAgICAgICAgLkNvbXBpbGVkQXNzZW1ibHkuQ3JlYXRlSW5zdGFuY2UoY2xhc3NOYW1lKTsKICAgICAgICAgICAgcHJvZ3JhbU9iamVjdC5HZXRUeXBlKCkuR2V0TWV0aG9kKCJNYWluIiwgQmluZGluZ0ZsYWdzLlN0YXRpYyB8IEJpbmRpbmdGbGFncy5Ob25QdWJsaWMpLkludm9rZShudWxsLCBudWxsKTsKICAgICAgICB9CgogICAgICAgIHN0YXRpYyB2b2lkIE1haW4oc3RyaW5nW10gYXJncykKICAgICAgICB7CiAgICAgICAgICAgIFJ1blByb2dyYW0oQCIKcHJvZ3JhbSB0ZXN0Owp2YXIgYSwgYiwgYzogaW50ZWdlcjsKYmVnaW4KICAgIHJlYWRsbihhKTsKICAgIHJlYWRsbihiKTsKICAgIGMgOj0gYSArIGI7CiAgICB3cml0ZWxuKGMpOwplbmQuCiIpOwogICAgICAgICAgICBSdW5Qcm9ncmFtKEAiCnByb2dyYW0gTXlQcm9ncmFtOwp2YXIgYSwgYiwgYywgZDogaW50ZWdlcjsKYmVnaW4KICAgIHJlYWRsbihhKTsKICAgIHJlYWRsbihiKTsKICAgIHJlYWRsbihkKTsKICAgIGMgOj0gKGEgKyBiKSAvIGQ7CiAgICB3cml0ZWxuKGMpOwplbmQuCiIpOyAgICAKICAgICAgICB9CiAgICB9Cn0=