Beispiel #1
0
        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
            });
        }
    }
Beispiel #4
0
 /// <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), "未知语句");
 }
Beispiel #5
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);
        }