public override void Visit(PutStat putStat)
        {
            int thisFrameSize = this.FunctionScope.GetStackFrameSize();

            char putFunctionChar = 'i';

            if (putStat.Expression.SemanticalType == "float")
            {
                putFunctionChar = 'f';
            }

            string putFunction = $"put{putFunctionChar}_func";

            this.LoadAndStore(putStat.Expression, thisFrameSize + 4, putStat.Expression.NodeMemorySize, $"Store the put value of {putStat.Expression}");
            InstructionStream.Add($"addi r14, r14, {thisFrameSize}");
            InstructionStream.Add($"jl r15, {putFunction}");
            InstructionStream.Add($"subi r14, r14, {thisFrameSize}");
        }
Example #2
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 #3
0
 public virtual void Visit(PutStat putStat)
 {
 }