コード例 #1
0
 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();
     }
 }
コード例 #2
0
 // 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));
     }
 }
コード例 #3
0
 public static void Advance(this ICompileContext context, int length)
 {
     if (length == 0)
     {
         return;
     }
     context.Append(AddAssign(context.Position, Constant(length)));
 }
コード例 #4
0
 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();
 }
コード例 #5
0
        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());
        }
コード例 #6
0
        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();
        }
コード例 #7
0
 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));
 }
コード例 #8
0
 public static void Fail(this ICompileContext context)
 => context.Append(Goto(context.Failure));
コード例 #9
0
ファイル: EOF.cs プロジェクト: hamish-milne/Lexico
 public override void Compile(ICompileContext context)
 {
     context.Append(IfThen(GreaterThan(context.Position, Constant(0)), Goto(context.Failure)));
     context.Succeed(Empty());
 }
コード例 #10
0
ファイル: EOF.cs プロジェクト: hamish-milne/Lexico
 public override void Compile(ICompileContext context)
 {
     context.Append(IfThen(LessThan(context.Position, context.Length), Goto(context.Failure)));
     context.Succeed(Empty());
 }