public override Block CompileNewState(Runtime runtime, StateForCompiler state) { ParserBlock block = new ParserBlock(); block.Comment("start of token --------------------"); // todo enter block.BeginScope(); BlockLocal start = block.SavePosition(); block.Emit(body.Compile(runtime, state)); BlockLocal bodyTree = new BlockLocal(typeof(ParseTree)); block.DeclareLocal(bodyTree); block.Dup(); block.StoreLocal(bodyTree); BlockLabel yes = new BlockLabel("yes"); block.BranchIfNotNo(yes); // todo no block.LoadNo(); BlockLabel returnLabel = new BlockLabel("return"); block.Branch(returnLabel); block.MarkLabel(yes); // todo yes block.LoadLexer(); block.GetProperty(typeof(Lexer).GetProperty("Text")); block.LoadLocal(start); block.LoadLexer(); block.GetProperty(typeof(Lexer).GetProperty("Position")); block.LoadLocal(start); block.Sub(); block.Call(typeof(string).GetMethod("Substring", new Type[] { typeof(int), typeof(int) })); block.New(typeof(ParseTree).GetConstructor(new Type[] { typeof(object) })); block.LoadLocal(bodyTree); block.Call(typeof(ParseTree).GetMethod("ExtendFields")); block.MarkLabel(returnLabel); block.EndScope(); block.Comment("end of token --------------------"); return(block); }