Exemple #1
0
        private static Exp OptimizeBnot(UnopExp exp)
        {
            switch (exp.Exp)
            {
            case IntegerExp ie:
            {
                ie.Val = ~ie.Val;
                return(ie);
            }

            case FloatExp fe:
            {
                if (LuaMath.FloatToInteger(fe.Val, out var ret))
                {
                    return(new IntegerExp
                        {
                            Line = exp.Line,
                            Val = ~ret
                        });
                }

                break;
            }
            }

            return(exp);
        }
Exemple #2
0
        private static void CgUnopExp(FuncInfo fi, UnopExp node, int a)
        {
            var b = fi.AllocReg();

            CgExp(fi, node.Exp, b, 1);
            fi.EmitUnaryOp(node.GetOpCode(), a, b);
            fi.FreeReg();
        }
Exemple #3
0
        private static Exp OptimizeUnm(UnopExp exp)
        {
            switch (exp.Exp)
            {
            case IntegerExp ie:
                ie.Val = -ie.Val;
                return(ie);

            case FloatExp fe:
                fe.Val = -fe.Val;
                return(fe);

            default:
                return(exp);
            }
        }
Exemple #4
0
        private static Exp OptimizeUnaryOp(UnopExp exp)
        {
            switch (exp.Op)
            {
            case ETokenType.OpUnm:
                return(OptimizeUnm(exp));

            case ETokenType.OpNot:
                return(OptimizeNot(exp));

            case ETokenType.OpBNot:
                return(OptimizeBnot(exp));

            default:
                return(exp);
            }
        }
Exemple #5
0
        private static Exp OptimizeNot(UnopExp exp)
        {
            switch (exp.Exp)
            {
            case NilExp ne:
            case FalseExp fe:
                return(new TrueExp {
                    Line = exp.Line
                });

            case TrueExp te:
            case IntegerExp ie:
            case FloatExp fe:
            case StringExp se:
                return(new FalseExp {
                    Line = exp.Line
                });

            default:
                return(exp);
            }
        }
Exemple #6
0
        private static Exp ParseExp2(Lexer.Lexer lexer)
        {
            switch (lexer.LookAhead())
            {
            case ETokenType.OpUnm:
            case ETokenType.OpBNot:
            case ETokenType.OpLen:
            case ETokenType.OpNot:
            {
                lexer.NextToken(out var line, out var op, out _);
                var exp = new UnopExp
                {
                    Line = line,
                    Op   = op,
                    Exp  = ParseExp2(lexer)
                };

                return(OptimizeUnaryOp(exp));
            }
            }

            return(ParseExp1(lexer));
        }