public override void Compile(ICompileContext context) { if (context.Cut == null) { previous.Compile(context); } else { var success = Label(); context.Child(previous, null, context.Result, success, context.Failure); context.Append(Label(success)); context.Append(Assign(context.Cut, Constant(true))); context.Succeed(); } }
// TODO: Check that succeed and fail are both called by child contexts? public static void Succeed(this ICompileContext context) { if (context.Success != null) { context.Append(Goto(context.Success)); } }
public static void Advance(this ICompileContext context, int length) { if (length == 0) { return; } context.Append(AddAssign(context.Position, Constant(length))); }
public static void Succeed(this ICompileContext context, Expression value) { if (context.Result?.CanWrite() == true) { context.Append(Assign(context.Result, Convert(value, context.Result.Type))); } context.Succeed(); }
public override void Compile(ICompileContext context) { var breakTarget = Label(); var fail = Goto(context.Failure); var succeed = Goto(breakTarget); context.Append(IfThen(GreaterThanOrEqual(context.Position, context.Length), succeed)); context.Append(Switch(context.Peek(0), fail, SwitchCase(Block(AddAssign(context.Position, Constant(1)), succeed), Constant('\n')), SwitchCase(IfThenElse(And( LessThan(Add(Constant(1), context.Position), context.Length), Equal(context.Peek(1), Constant('\n')) ), Block(AddAssign(context.Position, Constant(2)), succeed), fail), Constant('\r')) )); context.Append(Label(breakTarget)); context.Succeed(Empty()); }
public override void Compile(ICompileContext context) { var success = context.Success ?? Label(); var cut = context.Cache(Constant(false)); foreach (var option in _options) { var savePoint = context.Save(); context.Child(option, null, context.Result, success, savePoint, cut); context.Restore(savePoint); context.Append(IfThen(cut, Goto(context.Failure))); context.Release(savePoint); } context.Release(cut); context.Fail(); if (context.Success == null) { context.Append(Label(success)); } context.Succeed(); }
public override void Compile(ICompileContext context) { context.Append(IfThen(GreaterThanOrEqual(context.Position, context.Length), Goto(context.Failure))); context.Advance(1); context.Succeed(context.Peek(-1)); }
public static void Fail(this ICompileContext context) => context.Append(Goto(context.Failure));
public override void Compile(ICompileContext context) { context.Append(IfThen(GreaterThan(context.Position, Constant(0)), Goto(context.Failure))); context.Succeed(Empty()); }
public override void Compile(ICompileContext context) { context.Append(IfThen(LessThan(context.Position, context.Length), Goto(context.Failure))); context.Succeed(Empty()); }