private static EvalValue CalcIf(IEnvironment env, AstIf ast) { // 返回值为执行的最后一条语句或表达式的值 var ret = new EvalValue(); var cond = ast.condition.Eval(env); if (cond.type == EvalValueType.STRING) { throw new RunTimeException("条件表达式不能为字符串", ast.condition); } else if (cond.type == EvalValueType.INT && cond.intVal > 0) { foreach (var item in ast) { ret = item.Eval(env); } } else if (ast.elseBlock != null) { // 有else块 foreach (var item in ast.elseBlock) { ret = item.Eval(env); } } return(ret); }
AstIf ProcessIfStatement(AstIf astIf) { var safeLastIfAlternative = _lastIfAlternative; _lastIfAlternative = astIf.Alternative; Descend(); _lastIfAlternative = safeLastIfAlternative; IsAfterJump = false; return(astIf); }
static AstNode RemoveUnreachableCode(AstIf ifStatement, bool inList) { var conditionValue = ifStatement.Condition.ConstValue(); if (conditionValue == null) { return(ifStatement); } AstStatement?statement; AstStatement?falsyStatement; if (TypeConverter.ToBoolean(conditionValue)) { statement = ifStatement.Body; falsyStatement = ifStatement.Alternative; } else { statement = ifStatement.Alternative; falsyStatement = ifStatement.Body; } AstVar?declarations = null; if (falsyStatement != null) { declarations = GetDeclarations(falsyStatement); } switch (statement) { case null: return(declarations ?? Remove); default: if (declarations == null) { return(statement); } var statements = new StructList <AstNode>(); statements.Add(declarations); statements.Add(statement); return(inList ? SpreadStructList(ref statements) : new AstBlock(ifStatement) { Body = statements }); } }
/// <summary> /// 解析语句state /// </summary> /// <returns></returns> private AstStatement DoStatement() { // state ::== <while><expr><do>{<expr>|<state>}<end>';' // | <if><expr><do>{<expr>|<state>}<end>';' // | <return><expr>';' if (Is("while", TokenType.KEYWORD)) { // while语句 Pass("while", TokenType.KEYWORD); AstExpression condition = DoExpression(); Pass("do", TokenType.KEYWORD); List <AstNode> list = DoBlock(); Pass("end", TokenType.KEYWORD); Pass(";", TokenType.SEPERATOR); var ret = new AstWhile(list, condition); Utils.LogDebug("[P] while语句: {0}", ret.ToString()); return(ret); } if (Is("if", TokenType.KEYWORD)) { // if语句 Pass("if", TokenType.KEYWORD); AstExpression condition = DoExpression(); Pass("do", TokenType.KEYWORD); List <AstNode> list = DoBlock(); List <AstNode> elseList = null; if (Is("else", TokenType.KEYWORD)) { // 有else块 Pass("else", TokenType.KEYWORD); elseList = DoBlock(); } Pass("end", TokenType.KEYWORD); Pass(";", TokenType.SEPERATOR); var ret = new AstIf(list, condition, elseList); Utils.LogDebug("[P] if语句: {0}", ret.ToString()); return(ret); } if (Is("return", TokenType.KEYWORD)) { // return语句 Pass("return", TokenType.KEYWORD); AstExpression expr = DoExpression(); var ret = new AstReturn(new List <AstNode>(), expr); Utils.LogDebug("[P] return语句: {0}", ret.ToString()); return(ret); } throw new ParseException(m_scanner.Peek(0), "未知语句"); }
private void CompileIf(AstIf node, Syt syt, StringBuilder sb) { var lblTrue = Id("IF_TRUE"); var lblEndif = Id("IF_END"); CompileRecursive(node.exprCond, syt, sb); sb.AppendLine("if-goto " + lblTrue); if (node.rgstmElse != null) CompileRecursive(node.rgstmElse, syt, sb); sb.AppendLine("goto " + lblEndif); sb.AppendLine("label " + lblTrue); CompileRecursive(node.rgstm, syt, sb); sb.AppendLine("label " + lblEndif); }