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) { context.Append(IfThen(GreaterThanOrEqual(context.Position, context.Length), Goto(context.Failure))); context.Advance(1); context.Succeed(context.Peek(-1)); }