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); }
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); }