Example #1
0
        public bool Match(XMLLuaSearchIfStatement req, IfStat real)
        {
            Logger.Debug($"if_statement");
            if (!Match(req.Block, real.Block))
            {
                return(false);
            }
            if (!Match(req.Condition, real.Condition))
            {
                return(false);
            }
            if (!Match(req.Else, real.ElseBlock))
            {
                return(false);
            }
            if (req.ElseIfs.Count != real.ElseIfs.Count)
            {
                return(false);
            }

            for (var i = 0; i < req.ElseIfs.Count; i++)
            {
                if (!Match(req.ElseIfs[i], real.ElseIfs[i]))
                {
                    return(false);
                }
            }
            SetSelectionIfSelected(real.Span, req);
            return(true);
        }
Example #2
0
        static LuaArguments EvalIf(IfStat stat, LuaContext Context, out LuaReturnStatus returned)
        {
            returned.broke    = false;
            returned.returned = false;
            LuaArguments obj = new LuaObject[] { LuaObject.Nil };

            if (EvalExpression(stat.Condition, Context)[0].AsBool())
            {
                LuaContext ctx = new LuaContext(Context);
                obj = EvalBlock(stat.Block, ctx, out returned);
            }
            else
            {
                bool found = false;
                foreach (IfStat branch in stat.ElseIfs)
                {
                    if (EvalExpression(branch.Condition, Context)[0].AsBool())
                    {
                        LuaContext ctx = new LuaContext(Context);
                        obj   = EvalBlock(stat.Block, ctx, out returned);
                        found = true;
                        break;
                    }
                }
                if (!found && stat.ElseBlock != null)
                {
                    LuaContext ctx = new LuaContext(Context);
                    obj = EvalBlock(stat.ElseBlock, ctx, out returned);
                }
            }

            return(obj);
        }
Example #3
0
        public async Task ExecuteIfStat(IfStat ifStat, LuaState state, CancellationToken token)
        {
            var result = await _engine.EvaluateExpression(ifStat.Condition, state, token).FirstAsync();

            if (result.AsBool())
            {
                await _engine.ExecuteStatement(ifStat.Block, state, token);

                return;
            }

            if (ifStat.ElseIfs.Count > 0)
            {
                foreach (var elseIf in ifStat.ElseIfs)
                {
                    result = await _engine.EvaluateExpression(elseIf.Condition, state, token).FirstAsync();

                    if (!result.AsBool())
                    {
                        continue;
                    }

                    await _engine.ExecuteStatement(elseIf.Block, state, token);

                    return;
                }
            }

            if (ifStat.ElseBlock != null)
            {
                await _engine.ExecuteStatement(ifStat.ElseBlock, state, token);
            }
        }
        public override void PostConditionalVisit(IfStat ifStat)
        {
            string elseIdentifier = $"else_{ifStat.Location.line}_{ifStat.Location.column}";

            this.Load(ifStat.Condition, "r1");
            InstructionStream.Add($"bz r1, {elseIdentifier}", $"If {ifStat.Condition}.");
        }
Example #5
0
        public void iterateLogic(List <string> Lines, IfStat ifs)
        {
            var a = TypeToString((ifs.Condition as BinaryExpression).Left);
            var b = TypeToString((ifs.Condition as BinaryExpression).Right);

            Lines.Add("#/scoreboard players test lua " + a + " " + b + " " + b);
        }
        public override void PreElseBlockVisit(IfStat ifStat)
        {
            string elseIdentifier  = $"else_{ifStat.Location.line}_{ifStat.Location.column}";
            string endifIdentifier = $"endif_{ifStat.Location.line}_{ifStat.Location.column}";

            InstructionStream.Add($"j {endifIdentifier}", "Go to the end of the else block.");
            InstructionStream.Add($"{elseIdentifier}    nop", "Start the else block");
        }
Example #7
0
        static Expression CompileIfStat(Ast.IfStat ifstat, LabelTarget returnTarget, LabelTarget breakTarget, Expression Context)
        {
            var condition = GetAsBool(CompileSingleExpression(ifstat.Condition, Context));
            var block     = CompileBlock(ifstat.Block, returnTarget, breakTarget, Expression.New(LuaContext_New_parent, Context));

            if (ifstat.ElseIfs.Count == 0)
            {
                if (ifstat.ElseBlock == null)
                {
                    return(Expression.IfThen(condition, block));
                }
                else
                {
                    var elseBlock = CompileBlock(ifstat.ElseBlock, returnTarget, breakTarget, Expression.New(LuaContext_New_parent, Context));
                    return(Expression.IfThenElse(condition, block, elseBlock));
                }
            }
            else
            {
                Expression b = null;
                for (int i = ifstat.ElseIfs.Count - 1; i >= 0; i--)
                {
                    IfStat branch = ifstat.ElseIfs[i];
                    var    cond   = GetAsBool(CompileSingleExpression(branch.Condition, Context));
                    var    body   = CompileBlock(branch.Block, returnTarget, breakTarget, Expression.New(LuaContext_New_parent, Context));
                    if (b == null)
                    {
                        if (ifstat.ElseBlock == null)
                        {
                            b = Expression.IfThen(cond, body);
                        }
                        else
                        {
                            var elseBlock = CompileBlock(ifstat.ElseBlock, returnTarget, breakTarget, Expression.New(LuaContext_New_parent, Context));
                            b = Expression.IfThenElse(cond, body, elseBlock);
                        }
                    }
                    else
                    {
                        b = Expression.IfThenElse(cond, body, b);
                    }
                }

                var tree = Expression.IfThenElse(condition, block, b);
                return(tree);
            }
            throw new NotImplementedException();
        }
Example #8
0
        private static void CgIfStat(FuncInfo fi, IfStat node)
        {
            var pcJmpToEnds    = new int[node.Exps.Count];
            var pcJmpToNextExp = -1;

            for (var i = 0; i < node.Exps.Count; i++)
            {
                var exp = node.Exps[i];

                if (pcJmpToNextExp >= 0)
                {
                    fi.FixsBx(pcJmpToNextExp, fi.PC() - pcJmpToNextExp);
                }

                var r = fi.AllocReg();
                CgExp(fi, exp, r, 1);
                fi.FreeReg();

                fi.EmitTest(r, 0);
                pcJmpToNextExp = fi.EmitJmp(0, 0);

                fi.EnterScope(false);
                CgBlock(fi, node.Blocks[i]);
                fi.CloseOpenUpvals();
                fi.ExitScope();

                if (i < node.Exps.Count - 1)
                {
                    pcJmpToEnds[i] = fi.EmitJmp(0, 0);
                }
                else
                {
                    pcJmpToEnds[i] = pcJmpToNextExp;
                }
            }

            foreach (var pc in pcJmpToEnds)
            {
                fi.FixsBx(pc, fi.PC() - pc);
            }
        }
    }         // NT_ActParList

    private static void NT_IfStat(out Stat s)
    {
        Expr   e = null;
        Stat   thenStat = null, elseStat = null;
        SrcPos sp = null;

        s = null;

        for (;;)
        {
            switch (Syn.Interpret())
            {
            case 0:
                return;

            case 1: // SEM
                sp = new SrcPos();

                break;

            case 2:
                NT_Expr(out e);
                break;

            case 3:
                NT_Stat(out thenStat);
                break;

            case 4:
                NT_Stat(out elseStat);
                break;

            case 5: // SEM
                s = new IfStat(sp, e, thenStat, elseStat);

                break;
            } // switch
        }     // for
    }         // NT_IfStat
Example #10
0
        IfStat ParseIf(ParseTreeNode node)
        {
            if (node.Term.Name == "If")
            {
                IExpression condition = ParseExpression(node.ChildNodes[1]);
                Block       block     = ParseBlock(node.ChildNodes[3]);

                IfStat If = new IfStat();
                If.Block     = block;
                If.Condition = condition;
                If.ElseIfs   = new List <IfStat>();

                ParseTreeNode ElseifNode = node.ChildNodes[4];
                ParseTreeNode ElseNode   = node.ChildNodes[5];

                while (ElseifNode.ChildNodes.Count != 0)
                {
                    var    childnode = ElseifNode.ChildNodes[0];
                    IfStat elseif    = new IfStat();
                    elseif.Condition = ParseExpression(childnode.ChildNodes[1]);
                    elseif.Block     = ParseBlock(childnode.ChildNodes[3]);

                    If.ElseIfs.Add(elseif);

                    ElseifNode = childnode.ChildNodes[4];
                }

                if (ElseNode.ChildNodes.Count != 0)
                {
                    If.ElseBlock = ParseBlock(ElseNode.ChildNodes[0].ChildNodes[1]);
                }

                return(If);
            }
            throw new Exception("Invalid If node");
        }
Example #11
0
        private object NoASS()
        {
            string first = "if for get put return";

            this.SkipErrors(first);

            var    lookaheadToken = this.TokenStream.Peek();
            string lookahead      = lookaheadToken.AToCCFormat();

            if ("if".HasToken(lookahead))
            {
                this.ApplyDerivation("noASS -> 'if' '(' expr ')' 'then' statBlock 'else' statBlock ';'");

                var ifStatement = new IfStat(lookaheadToken.SourceLocation);

                Match("if");
                Match("(");
                var expr = Expr();
                Match(")");
                Match("then");
                var trueBlock = StatBlock();
                Match("else");
                var elseBlock = StatBlock();
                Match(";");

                ifStatement.Condition = expr;
                ifStatement.TrueBlock = trueBlock;
                ifStatement.ElseBlock = elseBlock;

                return(ifStatement);
            }

            if ("for".HasToken(lookahead))
            {
                this.ApplyDerivation("noASS -> 'for' '(' type 'id' '=' expr ';' relExpr ';' assignStat ')' statBlock ';'");

                var forStat = new ForStat(lookaheadToken.SourceLocation);

                Match("for");
                Match("(");
                string type       = Type();
                var    idLocation = this.TokenStream.Peek().SourceLocation;
                string id         = Match("id");
                Match("=");
                var initExpr = Expr();
                Match(";");
                var condition = RelExpr();
                Match(";");
                var assignStat = AssignStat();
                Match(")");
                var statBlock = StatBlock();
                Match(";");

                forStat.Type           = type;
                forStat.Id             = id;
                forStat.Initialization = initExpr;
                forStat.Condition      = condition;
                forStat.Update         = assignStat;
                forStat.LoopBlock      = statBlock;
                forStat.IdLocation     = idLocation;

                return(forStat);
            }

            if ("get".HasToken(lookahead))
            {
                this.ApplyDerivation("noASS -> 'get' '(' variable ')' ';'");

                var getStatement = new GetStat(lookaheadToken.SourceLocation);

                Match("get");
                Match("(");
                var variable = Variable();
                Match(")");
                Match(";");

                getStatement.Variable = variable;

                return(getStatement);
            }

            if ("put".HasToken(lookahead))
            {
                this.ApplyDerivation("noASS -> 'put' '(' expr ')' ';'");

                var putStatement = new PutStat(lookaheadToken.SourceLocation);

                Match("put");
                Match("(");
                var expr = Expr();
                Match(")");
                Match(";");

                putStatement.Expression = expr;

                return(putStatement);
            }

            if ("return".HasToken(lookahead))
            {
                this.ApplyDerivation("noASS -> 'return' '(' expr ')' ';'");

                var returnStatement = new ReturnStat(lookaheadToken.SourceLocation);

                Match("return");
                Match("(");
                var expr = Expr();
                Match(")");
                Match(";");

                returnStatement.ReturnValueExpression = expr;
                return(returnStatement);
            }

            return(null);
        }
Example #12
0
    } // DumpSymTab

    // === generate source text from symbol table and AST ===

    public static void WriteStat(Stat stat)
    {
        switch (stat.kind)
        {
        case Stat.Kind.emptyStatKind:
            genMcpp.WriteLine(Indent() + ";");
            break;

        case Stat.Kind.blockStatKind:
            BlockStat b_s = (BlockStat)stat;
            genMcpp.WriteLine(Indent() + "{");
            IncIndent();
            WriteStatList(b_s.statList);
            DecIndent();
            genMcpp.WriteLine(Indent() + "}");
            break;

        case Stat.Kind.incStatKind:
            IncStat i_s = (IncStat)stat;
            genMcpp.WriteLine(Indent() + i_s.vo.sy + "++;");
            break;

        case Stat.Kind.decStatKind:
            DecStat d_s = (DecStat)stat;
            genMcpp.WriteLine(Indent() + d_s.vo.sy + "--;");
            break;

        case Stat.Kind.assignStatKind:
            AssignStat a_s = (AssignStat)stat;
            genMcpp.WriteLine(Indent() + a_s.lhs + " = " + a_s.rhs + ";");
            break;

        case Stat.Kind.callStatKind:
            CallStat c_s = (CallStat)stat;
            genMcpp.WriteLine(Indent() + c_s.func + "(" + c_s.apl + ");");
            break;

        case Stat.Kind.ifStatKind:
            IfStat if_s = (IfStat)stat;
            genMcpp.WriteLine(Indent() + "if (" + if_s.cond + ")");
            IncIndent();
            WriteStatList(if_s.thenStat);
            DecIndent();
            if (if_s.elseStat != null)
            {
                genMcpp.WriteLine(Indent() + "else ");
                IncIndent();
                WriteStatList(if_s.elseStat);
                DecIndent();
            } // if
            break;

        case Stat.Kind.whileStatKind:
            WhileStat w_s = (WhileStat)stat;
            genMcpp.WriteLine(Indent() + "while (" + w_s.cond + ")");
            IncIndent();
            WriteStatList(w_s.body);
            DecIndent();
            break;

        case Stat.Kind.breakStatKind:
            genMcpp.WriteLine(Indent() + "break;");
            break;

        case Stat.Kind.inputStatKind:
            InputStat in_s = (InputStat)stat;
            genMcpp.WriteLine(Indent() + "cin >> " + in_s.vo.sy + ";");
            break;

        case Stat.Kind.outputStatKind:
            OutputStat out_s = (OutputStat)stat;
            genMcpp.Write(Indent() + "cout");
            foreach (Object o in out_s.values)
            {
                genMcpp.Write(" << ");
                if (o is Expr)
                {
                    genMcpp.Write(o);
                }
                else if (o is String)
                {
                    String s = o as String;
                    if (s == "\n")
                    {
                        genMcpp.Write("endl");
                    }
                    else
                    {
                        genMcpp.Write('"' + s + '"');
                    }
                }
                else
                {
                    throw new Exception("invalid value");
                }
            } // foreach
            genMcpp.WriteLine(";");
            break;

        case Stat.Kind.deleteStatKind:
            DeleteStat del_s = (DeleteStat)stat;
            genMcpp.WriteLine(Indent() + "delete[] " +
                              NameList.NameOf(del_s.vo.sy.spix) + ";");
            break;

        case Stat.Kind.returnStatKind:
            ReturnStat r_s = (ReturnStat)stat;
            genMcpp.Write(Indent() + "return");
            if (r_s.e != null)
            {
                genMcpp.Write(" " + r_s.e);
            }
            genMcpp.WriteLine(";");
            break;

        default:
            throw new Exception("invalid statement kind");
        } // switch
    }     // WriteStatList
Example #13
0
 public virtual void PreElseBlockVisit(IfStat ifStat)
 {
 }
Example #14
0
 public virtual void PostConditionalVisit(IfStat ifStat)
 {
 }
Example #15
0
 public virtual void PreVisit(IfStat ifStat)
 {
 }
        public override void Visit(IfStat ifStat)
        {
            string endifIdentifier = $"endif_{ifStat.Location.line}_{ifStat.Location.column}";

            InstructionStream.Add($"{endifIdentifier}    nop", "End the else block");
        }