예제 #1
0
파일: Parser.cs 프로젝트: strunberg/TEA
        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;
        }
예제 #2
0
        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;
        }