static void Main(string[] args) { var code = @" func Get1() { return 1; } proc Test() { Print(5); } proc PrintAddMul(x, y, z) { Print(x + y * z); } proc TestRet1(x) { if (x) { return; } else { // return; // unreachable code } return; } func TestRet2(x) { if (x) { return 1; } else { // return; // unreachable code } return 3; // must have } func TestRet3(x) { if (x) { return x; } else { return -x; } } func PrintAndGet(p, r) { Print(p); return r; } proc TestAndOr() { PrintAndGet(30, 0) && PrintAndGet(30, 1); // 30 PrintAndGet(31, 1) && PrintAndGet(31, 1); // 31 31 PrintAndGet(32, 1) || PrintAndGet(32, 1); // 32 PrintAndGet(33, 0) || PrintAndGet(33, 1); // 33 33 } proc Main(a, b, c) { var mvar; mvar = 11; Test(); Print(bbb + a); a = 5; Get1(); PrintAddMul(a + b, Get1(), mvar); EndSection(); Print(1 < 2); Print(1 < 0); Print(1 == 2); Print(1 == 1); if (2) { Print(333); } else { Print(222); } if (0) { Print(18); } else { Print(81); } EndSection(); TestAndOr(); EndSection(); setMe = 999; TestRet1(1); Print(TestRet2(2)); Print(TestRet3(3)); EndSection(); } "; var compiler = new Compiler(typeof(ExecutionContext)); { var parser = new LangParser(new CommonTokenStream(new LangLexer(new AntlrInputStream(code)))); parser.RemoveErrorListeners(); parser.AddErrorListener(new ThrowingErrorListener()); var tree = TreeTransformer.Transform(parser.program()); var result = compiler.Compile(tree); result.GetMethod("Main").Invoke(null, new object[] { 1, 2, 3 }); } Console.WriteLine("@@@ WITH MY PARSER @@@"); { var stream = new MemoryStream(); var writer = new StreamWriter(stream); writer.Write(code); writer.Flush(); stream.Position = 0; var parser = new LanguageParser.SimpleParser(); var tree = parser.Parse(new LanguageParser.SimpleLexer(stream)); var result = compiler.Compile(tree); result.GetMethod("Main").Invoke(null, new object[] { 1, 2, 3 }); } }