public Func <bool> Eval(Pointer pointer, string code, out int size) { RunicEnvironment context; ParseError err = Parser.Parse(code, "", out context); if (modifiers[pointer.position.x, pointer.position.y] == '͍') { context.SetReader(() => { if (pointer.GetStackSize() > 0) { return(pointer.Pop()); } return(null); }); context.SetWriter((o) => { pointer.Push(o); }); } else { context.SetWriter((o) => { outputWriter(o); }); } if (err.type != ParseErrorType.NONE || context == null) { size = 0; return(() => true); } context.Initialize(); size = context.runes.GetLength(0) + context.runes.GetLength(1); return(() => { bool continueExecuting = false; continueExecuting = context.Tick(); return !continueExecuting; }); }
public override ExecutionEnvironment Compile(string source, string input) { RunicEnvironment ctx; ParseError err = Parser.Parse(source, input, out ctx); if (err.type != ParseErrorType.NONE) { StringBuilder sb = new StringBuilder("Parser error: "); sb.Append(err.type.ToString()); sb.Append(" at position "); sb.Append(err.pos); sb.Append(", character '"); UnicodeCategory uc = CharUnicodeInfo.GetUnicodeCategory(err.character); if (uc == UnicodeCategory.NonSpacingMark || uc == UnicodeCategory.EnclosingMark) { sb.Append('◌'); } sb.Append(err.character); sb.Append("'"); throw new CompileException(sb.ToString(), err.pos1d, 1); } ctx.Initialize(); return(ctx); }