private bool ParseNegativeExpression(TokenReader reader, out Expression expression) { expression = null; Token start = reader.Peek(); if (!this.Expect(reader, Keyword.Minus)) { return false; } Expression inner = null; if (!this.ParseFactorExpression(reader, out inner)) { return false; } expression = new NegativeExpression(start, inner); return true; }
private bool TryEmitNegativeExpression( NegativeExpression expression, CompilerContext context, Scope scope, MethodImpl method, out TypeDefinition valueType) { if (!this.TryEmitExpression(expression.Inner, context, scope, method, out valueType)) { return false; } if (valueType.IsFloatingPoint) { method.Statements.Add(new AsmStatement { Instruction = "fchs" }); } else if (valueType.IsPointer || valueType.IsClass || valueType.IsArray || valueType.IsInterface) { string message = string.Format( System.Globalization.CultureInfo.CurrentCulture, Properties.Resources.CodeGenerator_NegativeNotSupported, valueType.FullName); this.log.Write(new Message( expression.Start.Path, expression.Start.Line, expression.Start.Column, Severity.Error, message)); return false; } else { method.Statements.Add(new AsmStatement { Instruction = "neg eax" }); } return true; }