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); }
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); }
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}."); }
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"); }
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(); }
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
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"); }
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); }
} // 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
public virtual void PreElseBlockVisit(IfStat ifStat) { }
public virtual void PostConditionalVisit(IfStat ifStat) { }
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"); }