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); }
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(); }
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); } }
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); } }
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); } }
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)); }