private KecaknoahUnaryExpressionAstNode ParseUnaryExpression(Queue<KecaknoahToken> tokens) { var ut = tokens.Peek(); switch (ut.Type) { case KecaknoahTokenType.Minus: tokens.Dequeue(); var mue = new KecaknoahUnaryExpressionAstNode(); mue.Target = ParsePrimaryExpression(tokens); mue.ExpressionType = KecaknoahOperatorType.Minus; return mue; case KecaknoahTokenType.Not: tokens.Dequeue(); var nue = new KecaknoahUnaryExpressionAstNode(); nue.Target = ParsePrimaryExpression(tokens); nue.ExpressionType = KecaknoahOperatorType.Not; return nue; case KecaknoahTokenType.Increment: tokens.Dequeue(); var iue = new KecaknoahUnaryExpressionAstNode(); iue.Target = ParsePrimaryExpression(tokens); iue.ExpressionType = KecaknoahOperatorType.Increment; return iue; case KecaknoahTokenType.Decrement: tokens.Dequeue(); var due = new KecaknoahUnaryExpressionAstNode(); due.Target = ParsePrimaryExpression(tokens); due.ExpressionType = KecaknoahOperatorType.Decrement; return due; case KecaknoahTokenType.Plus: tokens.Dequeue(); goto default; default: var pe = ParsePrimaryExpression(tokens); return pe; } }
internal IList<KecaknoahILCode> PrecompilePrefixIncrement(KecaknoahUnaryExpressionAstNode node) { var result = new List<KecaknoahILCode>(); result.AddRange(PrecompileExpression(node.Target)); result.Add(new KecaknoahILCode { Type = KecaknoahILCodeType.PushInteger, IntegerValue = 1 }); result.Add(new KecaknoahILCode { Type = KecaknoahILCodeType.PlusAssign }); return result; }