本文整理汇总了C#中BinaryOperator.SetLeftOperand方法的典型用法代码示例。如果您正苦于以下问题:C# BinaryOperator.SetLeftOperand方法的具体用法?C# BinaryOperator.SetLeftOperand怎么用?C# BinaryOperator.SetLeftOperand使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类BinaryOperator
的用法示例。
在下文中一共展示了BinaryOperator.SetLeftOperand方法的3个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: ConvertUnaryOperand
public static UnaryConvertResult ConvertUnaryOperand(Expression operand, Token op)
{
UnaryConvertResult res = new UnaryConvertResult();
Symbols.Type t = operand.GetType();
switch (op.type)
{
case Token.Type.OP_INC:
case Token.Type.OP_DEC:
Token.Type tt = op.type == Token.Type.OP_DEC ?
Token.Type.OP_SUB_ASSIGN : Token.Type.OP_PLUS_ASSIGN;
BinaryOperator bop = new BinaryOperator(new Token(tt));
bop.SetLeftOperand(operand);
bop.SetRightOperand(new Const("1", new Symbols.INT()));
res.type = bop.GetType();
break;
case Token.Type.OP_BIT_AND:
if (!(operand.IsLvalue() || operand.GetType() is Symbols.Func))
{
throw new Symbols.Exception(operand, NOT_LVALUE_OR_FUNC);
}
res.type = new Symbols.POINTER(operand.GetType());
break;
case Token.Type.OP_STAR:
res.lvalue = true;
if (!(t is Symbols.POINTER || t is Symbols.Func))
{
throw new Symbols.Exception(operand, NOT_POINTER);
}
if (t is Symbols.Func)
{
res.type = t;
}
else
{
res.type = ((Symbols.RefType)t).GetRefType();
}
break;
case Token.Type.OP_PLUS:
case Token.Type.OP_SUB:
if (!t.IsArifmetic())
{
throw new Symbols.Exception(operand, NOT_ARITHMETICAL);
}
res.type = t;
break;
case Token.Type.OP_TILDE:
if (!t.IsInteger())
{
throw new Symbols.Exception(operand, NOT_INTEGER);
}
res.type = t;
break;
case Token.Type.OP_NOT:
if (!(t.IsArifmetic() || t is Symbols.Func || t is Symbols.POINTER))
{
throw new Symbols.Exception(operand, string.Format(NO_OPERATOR, op.GetStrVal()));
}
res.type = new Symbols.INT();
break;
case Token.Type.KW_SIZEOF:
res.type = new Symbols.INT();
break;
case Token.Type.OP_DOT:
default:
throw new System.NotImplementedException();
}
res.operand = operand;
return res;
}
示例2: ConvertBinaryOperands
public static BinaryConvertResult ConvertBinaryOperands(Expression lop, Expression rop, Token op)
{
Symbols.Type lt = lop.GetType(), rt = rop.GetType();
BinaryConvertResult res = new BinaryConvertResult();
res.op = op;
Pair<Expression, Expression> uacon = null;
switch (op.type)
{
case Token.Type.OP_STAR:
case Token.Type.OP_DIV:
if (!lt.IsArifmetic())
{
throw new Symbols.Exception(lop, NOT_ARITHMETICAL);
}
if (!rt.IsArifmetic())
{
throw new Symbols.Exception(rop, NOT_ARITHMETICAL);
}
if (op.type == Token.Type.OP_MOD)
{
if (!lt.IsArifmetic())
{
lop = new Cast(lop, new Symbols.INT());
}
if (!rt.IsArifmetic())
{
rop = new Cast(rop, new Symbols.INT());
}
res.type = rop.GetType();
break;
}
uacon = UsualArithmeticConversions(lop, rop);
lop = uacon.first;
rop = uacon.last;
res.type = lop.GetType();
break;
case Token.Type.OP_MOD:
if (!lt.IsInteger())
{
throw new Symbols.Exception(lop, NOT_INTEGER);
}
if (!rt.IsInteger())
{
throw new Symbols.Exception(rop, NOT_INTEGER);
}
if (op.type == Token.Type.OP_MOD)
{
if (!(lt is Symbols.INT))
{
lop = new Cast(lop, new Symbols.INT());
}
if (!(rt is Symbols.INT))
{
rop = new Cast(rop, new Symbols.INT());
}
res.type = rop.GetType();
break;
}
uacon = UsualArithmeticConversions(lop, rop);
lop = uacon.first;
rop = uacon.last;
res.type = lop.GetType();
break;
case Token.Type.OP_PLUS:
case Token.Type.OP_SUB:
if (rt is Symbols.POINTER || lt is Symbols.POINTER)
{
if (rt is Symbols.POINTER && lt is Symbols.POINTER)
{
if (op.type == Token.Type.OP_PLUS)
{
throw new Symbols.Exception(lop, NOT_ARITHMETICAL);
}
res.type = rt;
break;
}
BinaryOperator binop = new BinaryOperator(new Token(Token.Type.OP_STAR));
int size = 0;
if (rt is Symbols.POINTER)
{
lop = lt is Symbols.INT ? lop : new Cast(lop, new Symbols.INT());
binop.SetLeftOperand(lop);
size = ((Symbols.POINTER)rt).GetRefType().GetSizeType();
binop.SetRightOperand(new Const(size.ToString(), new Symbols.INT()));
lop = binop;
res.type = rt;
}
else
{
rop = rt is Symbols.INT ? rop : new Cast(rop, new Symbols.INT());
binop.SetLeftOperand(rop);
size = ((Symbols.POINTER)lt).GetRefType().GetSizeType();
binop.SetRightOperand(new Const(size.ToString(), new Symbols.INT()));
rop = binop;
res.type = lt;
//.........这里部分代码省略.........
示例3: Modified
public override Expression Modified()
{
Expression res = null;
switch (this.op.type)
{
case Token.Type.LBRACKET:
BinaryOperator bop = new BinaryOperator(new Token(Token.Type.OP_PLUS));
if (this.expr is Refference && ((Refference)this.expr).op.type == Token.Type.LBRACKET)
{
UnaryOperator u = new UnaryOperator(new Token(Token.Type.OP_BIT_AND));
this.expr.SetType(((Symbols.RefType)this.expr.GetType()).GetRefType());
u.SetOperand(this.expr);
bop.SetRightOperand(u);
}
else
{
bop.SetRightOperand(this.expr);
}
bop.SetLeftOperand(this.refference);
res = new UnaryOperator(new Token(Token.Type.OP_STAR));
((UnaryOperator)res).SetOperand(bop);
break;
case Token.Type.OP_REF:
UnaryOperator rop = new UnaryOperator(new Token(Token.Type.OP_STAR));
rop.SetOperand(this.expr);
res = new Refference(new Token(Token.Type.OP_DOT));
((Refference)res).SetExpression(rop);
((Refference)res).SetRefference(this.refference);
break;
}
return res == null ? this : res.Modified();
}