Ejemplo n.º 1
0
 public DefaultBasicHost(IBasicInputOutput io = null)
 {
     this.io = io ?? new TextWriterIO(Console.Out);
 }
Ejemplo n.º 2
0
        public override BasicNode Eval(BasicEnvironment env)
        {
            env.InstructionCount++;
            runtime = env;
            printer = env.printer;
            bool suppressNL = false;

            for (int i = 0; i < items.Count; i++)
            {
                suppressNL = false;
                var item = items[i];
                var node = item as BasicNode;
                if (node != null)
                {
                    node = node.Eval(env);
                    if (node.IsAbort())
                    {
                        return(node);
                    }
                    var sNode = node as StringConstantNode;
                    if (sNode != null)
                    {
                        WriteString(sNode.Text);
                        continue;
                    }
                    var nNode = node as NumericConstantNode;
                    if (nNode != null)
                    {
                        WriteNumericConstant(nNode);
                        continue;
                    }
                    var cNode = node as ControlNode;
                    if (cNode.Kind == EvalResultKind.Tab)
                    {
                        var numNode = cNode.Target as NumericConstantNode;
                        int amount  = numNode.IntValue;
                        if (amount <= 0)
                        {
                            env.RuntimeError(ERuntimeErrors.InvalidTab, amount);
                            amount = 1;
                        }
                        amount--;
                        if (runtime.Column < amount)
                        {
                            WriteString(new string(' ', amount - runtime.Column));
                        }
                        else
                        {
                            printer.NewLine();
                            WriteString(new string(' ', amount));
                        }
                        continue;
                    }
                    return(env.RuntimeError());
                }
                var sval = item as string;
                if (sval == ",")
                {
                    int rem = runtime.Column % printer.PrintZoneWidth;
                    rem = printer.PrintZoneWidth - rem;
                    WriteString(new string(' ', rem));
                }
                if (sval == ";" || sval == ",")
                {
                    suppressNL = true;
                    continue;
                }
                return(env.RuntimeError());
            }
            if (!suppressNL)
            {
                runtime.Column = 0;
                printer.NewLine();
            }
            return(this);
        }