Example #1
0
File: VM.cs Project: haefele/Speare
        public static VM FromBuilder(OpBuilder ops)
        {
            var runtime = new VM();

            ops.Build(out runtime.Ops, out runtime.Chrh, out runtime.Chrb, out runtime.Mth);
            return(runtime);
        }
        public override object VisitPrintStatement([NotNull] TinyScriptParser.PrintStatementContext context)
        {
            var ret = (Type)VisitExpression(context.expression());
            var b   = OpBuilder.GetOpBuilder(ret, context, _builder);

            b.CallToString();
            _builder.EmitPrint();
            return(null);
        }
Example #3
0
        static void Main(string[] args)
        {
            Interop.RegisterMethodsOf <Program>();

            var builder = new OpBuilder();

            builder.Method()
            .Constant(Register.R0, 0)
            .Constant(Register.R1, 5)
            .Label(":loop")
            .Constant(Register.R2, 1)
            .Add(Register.R0, Register.R2)
            .Move(Register.LastResult, Register.R0)
            .DebugPrint(Register.R0)
            .Compare(Register.R0, Register.R1, Comparison.SmallerThan)
            .JumpIfTrue(":loop")
            .Constant(Register.R3, "We made it through the loop!")
            .DebugPrint(Register.R3)
            .Constant(Register.Param0, "Another test")
            .Call(methodIndex: 1)
            .DebugPrint(Register.LastResult)
            .Constant(Register.Param0, "hi")
            .Interop("PrintVector")
            .Method(parameterCount: 1)
            .DebugPrint(Register.Param0)
            .Constant(Register.LastResult, 199)
            .Return();

            var runtime = VM.FromBuilder(builder);

            runtime.Run(methodIndex: 0).MoveNext();

            /*Console.WriteLine(code);
             * Console.WriteLine();
             * Console.WriteLine("=== TOKENIZER RESULT ===");
             *
             * foreach (var token in tokens)
             * {
             *  if (token.Type == TokenType.EOF)
             *      break;
             *
             *  var tokenType = token.Type.ToString();
             *  Console.WriteLine(
             *      "{0}{1}'{2}'",
             *      tokenType,
             *      string.Empty.PadLeft(24 - tokenType.Length),
             *      token.ToString()
             *  );
             * }
             */
            Console.ReadLine();
        }
        public override object VisitUnaryExpression([NotNull] TinyScriptParser.UnaryExpressionContext context)
        {
            if (context.ChildCount == 1)
            {
                return(VisitPrimaryExpression(context.primaryExpression()));
            }
            var ret = (Type)VisitUnaryExpression(context.unaryExpression());
            var op  = context.GetChild(0).GetText();
            var b   = OpBuilder.GetOpBuilder(ret, context, _builder);

            b.ProcessUnary(op);
            return(ret);
        }
        public override object VisitCmpExpression([NotNull] TinyScriptParser.CmpExpressionContext context)
        {
            var ret = (Type)VisitAddExpression(context.addExpression(0));

            if (context.ChildCount > 1)
            {
                var t2      = (Type)VisitAddExpression(context.addExpression(1));
                var op      = context.GetChild(1).GetText();
                var cmpType = GetOpType(context, ret, t2);
                var b       = OpBuilder.GetOpBuilder(cmpType, context, _builder);
                b.ProcessCmp(op);
                return(typeof(bool));
            }
            return(ret);
        }
 public override object VisitPrimaryExpression([NotNull] TinyScriptParser.PrimaryExpressionContext context)
 {
     if (context.ChildCount == 1)
     {
         var c = context.GetChild(0);
         if (c is TinyScriptParser.VariableExpressionContext)
         {
             return(VisitVariableExpression(context.variableExpression()));
         }
         var num = context.numericLiteral().GetText().Replace("_", "");
         var b   = OpBuilder.GetOpBuilder(typeof(decimal), context, _builder);
         b.LoadNum(num);
         return(typeof(decimal));
     }
     return(VisitExpression(context.expression()));
 }
        public override object VisitMulExpression([NotNull] TinyScriptParser.MulExpressionContext context)
        {
            var ret = (Type)VisitUnaryExpression(context.unaryExpression(0));

            if (context.ChildCount > 1)
            {
                Type typeAdd = null;
                for (int i = 1; i < context.ChildCount; i += 2)
                {
                    var op = context.GetChild(i).GetText();
                    var t2 = (Type)VisitUnaryExpression((TinyScriptParser.UnaryExpressionContext)context.GetChild(i + 1));
                    typeAdd = GetOpType(context, ret, t2);
                    var b = OpBuilder.GetOpBuilder(typeAdd, context, _builder);
                    b.ProcessMul(op);
                }
                return(typeAdd);
            }
            return(ret);
        }
        public override object VisitAddExpression([NotNull] TinyScriptParser.AddExpressionContext context)
        {
            var ret = (Type)VisitMulExpression(context.mulExpression(0));

            if (context.ChildCount > 1)
            {
                Type typeAdd = null;
                for (int i = 1; i < context.ChildCount; i += 2)
                {
                    var op = context.GetChild(i).GetText();
                    var t2 = (Type)VisitMulExpression((TinyScriptParser.MulExpressionContext)context.GetChild(i + 1));
                    typeAdd = ret == typeof(string) ? ret : GetOpType(context, ret, t2);
                    if (ret == typeof(string) && t2.IsValueType)
                    {
                        _builder.Box(t2);
                    }
                    var b = OpBuilder.GetOpBuilder(typeAdd, context, _builder);
                    b.ProcessAdd(op);
                }
                return(typeAdd);
            }
            return(ret);
        }