Esempio n. 1
0
        private void GenerateCodeForStandardOperator(SplitExpression expression)
        {
            OperatorToken theOperator = expression.Operator as OperatorToken;

            if (theOperator == null)
            {
                throw new CompilerMessage(ErrorCode.InternalError, "ProcessStandardOperator called without OperatorToken");
            }

            if (expression.RightHandSide.Count < 1)
            {
                throw new CompilerMessage(ErrorCode.OperatorExpectsRightHandSide, "Expected expression after '" + expression.Operator.Name + "'");
            }

            if (expression.LeftHandSide.Count < 1)
            {
                if (theOperator.HasLeftHandSide == RequiredState.Required)
                {
                    throw new CompilerMessage(ErrorCode.OperatorExpectsLeftHandSide, "Expected expression before '" + expression.Operator.Name + "'");
                }
            }
            else if (theOperator.HasLeftHandSide == RequiredState.NotAllowed)
            {
                throw new CompilerMessage(ErrorCode.OperatorDoesNotExpectLeftHandSide, "Unexpected expression before '" + expression.Operator.Name + "'");
            }
            else
            {
                GenerateCodeForExpression(expression.LeftHandSide);
            }

            GenerateCodeForExpression(expression.RightHandSide);

            // TODO: Apply operator
        }
Esempio n. 2
0
        private void GenerateCodeForExpression(Expression expression)
        {
            Expression split = expression.SplitExpressionOnLowestPrecendenceOperator();

            if (split is SplitExpression)
            {
                SplitExpression splitExpression = (SplitExpression)split;

                if (splitExpression.Operator is OperatorToken)
                {
                    GenerateCodeForStandardOperator(splitExpression);
                }
                else
                {
                    GenerateCodeForAssignmentOperator(splitExpression);
                }

                // TODO: Check type mismatch after expressions have been parsed
                //splitExpression.CheckForTypeMismatch();
                //splitExpression.CheckOperatorCanBeAppliedToTheseTypes();
            }
            else
            {
                GenerateCodeForExpressionWithoutOperator(split);
            }
        }
Esempio n. 3
0
        private void GenerateCodeForAssignmentOperator(SplitExpression expression)
        {
            KeywordToken theOperator = expression.Operator as KeywordToken;

            if ((theOperator == null) || (!theOperator.IsModificationOperator))
            {
                throw new CompilerMessage(ErrorCode.InternalError, "GenerateCodeForAssignmentOperator called without KeywordToken");
            }

            if (expression.LeftHandSide.Count < 1)
            {
                throw new CompilerMessage(ErrorCode.OperatorExpectsLeftHandSide, "Expected expression before '" + expression.Operator.Name + "'");
            }

            if ((theOperator.SymbolType != PredefinedSymbol.PlusPlus) &&
                (theOperator.SymbolType != PredefinedSymbol.MinusMinus))
            {
                GenerateCodeForExpression(expression.RightHandSide);
            }

            if (theOperator.SymbolType != PredefinedSymbol.SetEqual)
            {
                GenerateCodeForExpression(expression.LeftHandSide);
            }

            // TODO: Apply operator

            //TODO: GenerateCodeToWriteNewVariableValue
        }
Esempio n. 4
0
        private void GenerateCodeForAssignmentOperator(SplitExpression expression)
        {
            KeywordToken theOperator = expression.Operator as KeywordToken;
            if ((theOperator == null) || (!theOperator.IsModificationOperator))
            {
                throw new CompilerMessage(ErrorCode.InternalError, "GenerateCodeForAssignmentOperator called without KeywordToken");
            }

            if (expression.LeftHandSide.Count < 1)
            {
                throw new CompilerMessage(ErrorCode.OperatorExpectsLeftHandSide, "Expected expression before '" + expression.Operator.Name + "'");
            }

            if ((theOperator.SymbolType != PredefinedSymbol.PlusPlus) &&
                (theOperator.SymbolType != PredefinedSymbol.MinusMinus))
            {
                GenerateCodeForExpression(expression.RightHandSide);
            }

            if (theOperator.SymbolType != PredefinedSymbol.SetEqual)
            {
                GenerateCodeForExpression(expression.LeftHandSide);
            }

            // TODO: Apply operator

            //TODO: GenerateCodeToWriteNewVariableValue
        }
Esempio n. 5
0
        private void GenerateCodeForStandardOperator(SplitExpression expression)
        {
            OperatorToken theOperator = expression.Operator as OperatorToken;
            if (theOperator == null)
            {
                throw new CompilerMessage(ErrorCode.InternalError, "ProcessStandardOperator called without OperatorToken");
            }

            if (expression.RightHandSide.Count < 1)
            {
                throw new CompilerMessage(ErrorCode.OperatorExpectsRightHandSide, "Expected expression after '" + expression.Operator.Name + "'");
            }

            if (expression.LeftHandSide.Count < 1)
            {
                if (theOperator.HasLeftHandSide == RequiredState.Required)
                {
                    throw new CompilerMessage(ErrorCode.OperatorExpectsLeftHandSide, "Expected expression before '" + expression.Operator.Name + "'");
                }
            }
            else if (theOperator.HasLeftHandSide == RequiredState.NotAllowed)
            {
                throw new CompilerMessage(ErrorCode.OperatorDoesNotExpectLeftHandSide, "Unexpected expression before '" + expression.Operator.Name + "'");
            }
            else
            {
                GenerateCodeForExpression(expression.LeftHandSide);
            }

            GenerateCodeForExpression(expression.RightHandSide);

            // TODO: Apply operator
        }