Beispiel #1
0
        static void setNewExpectVariable(expectType expect, VariableTypes newType, int lineNumber, Logic[] logicOrder)
        {
            if (expect.currentType == VariableTypes.unknown)
            {
                return;
            }

            if (expect.currentType == VariableTypes.unsigned)
            {
                expect.currentType = newType;
            }
            else if (expect.currentType != newType)
            {
                var firstSumType  = SumParser.TypeToString(expect.currentType);
                var secondSumType = SumParser.TypeToString(newType);

                string errorMessage;

                if (firstSumType == "" || secondSumType == "")
                {
                    errorMessage = "Misslyckades med att para ihop " + expect.currentType + " med " + newType;
                }
                else
                {
                    errorMessage = "Kan inte para ihop " + firstSumType + " med " + secondSumType + ".";
                }

                ErrorMessage.sendErrorMessage(lineNumber, errorMessage);
            }

            if (expect.currentType == VariableTypes.boolean)
            {
                BooleanSumParser.validBoolSum(logicOrder, lineNumber);
            }
        }
        public static bool parseExpression(Logic[] logicOrder, int lineNumber, Scope currentScope)
        {
            #region findOperators
            int operatorLow    = -1;
            int operatorHigh   = -1;
            int operatorAmount = 0;
            for (int i = 0; i < logicOrder.Length; i++)
            {
                if (isStatementOperator(logicOrder [i]))
                {
                    if (operatorLow == -1)
                    {
                        operatorLow = i;
                    }
                    else
                    {
                        operatorHigh = i;
                    }
                    operatorAmount++;
                }
            }


            #endregion


            if (operatorAmount > 2 && operatorHigh - operatorLow != 1)
            {
                ErrorMessage.sendErrorMessage(lineNumber, "I detta moment är det inte tillåtet att gör flera jämförelser direkt efter varandra. Använd \"and\" och \"or\" istället.");
            }
            if (operatorAmount == 0)
            {
                return(handleOnlyValueStatement(logicOrder, lineNumber, currentScope));
            }

            if (operatorAmount == 2)
            {
                if (operatorHigh - operatorLow != 1)
                {
                    ErrorMessage.sendErrorMessage(lineNumber, "Operatorerna måste komma direkt efter varandra");
                }
            }
            else
            {
                operatorHigh = operatorLow;
            }



            Logic[] leftSide  = new Logic[operatorLow];
            Logic[] rightSide = new Logic[logicOrder.Length - 1 - operatorHigh];
            Logic[] operators = new Logic[operatorAmount];
            setSidesOfStatement(logicOrder, leftSide, rightSide, operators, operatorLow, operatorHigh);


            Variable       firstSum     = SumParser.parseIntoSum(leftSide, lineNumber, currentScope);
            Variable       secondSum    = SumParser.parseIntoSum(rightSide, lineNumber, currentScope);
            ComparisonType operatorType = ComparisonOperatorParser.parseOperators(operators);

            if (operatorType == ComparisonType.unknown)
            {
                if (operators[0].currentType == WordTypes.equalSign)
                {
                    ErrorMessage.sendErrorMessage(lineNumber, "Fel vid tilldelning. Kom ihåg att använda == om du vill jämföra om två värden är lika.");
                }
                else
                {
                    ErrorMessage.sendErrorMessage(lineNumber, "Operatorerna går inte att tyda");
                }
            }

            if (firstSum.variableType == VariableTypes.unknown || secondSum.variableType == VariableTypes.unknown)
            {
                ErrorMessage.sendErrorMessage(lineNumber, "Korrupt värde");
            }

            if (firstSum.variableType != secondSum.variableType)
            {
                var firstSumType  = SumParser.TypeToString(firstSum.variableType);
                var secondSumType = SumParser.TypeToString(secondSum.variableType);

                string errorMessage;

                if (firstSumType == "" || secondSumType == "")
                {
                    errorMessage = "Misslyckades med att jämföra " + firstSum.variableType + " med " + secondSum.variableType;
                }
                else
                {
                    errorMessage = "Kan inte jämföra " + firstSumType + " med " + secondSumType + ".";
                }

                ErrorMessage.sendErrorMessage(lineNumber, errorMessage);
            }

            if (ComparisonOperatorParser.checkSumsToOperator(firstSum.variableType, operatorType, lineNumber))
            {
                bool resultOfComparison = ComparisonOperatorParser.makeComparison(firstSum, secondSum, operatorType, lineNumber);
                return(resultOfComparison);
            }

            ErrorMessage.sendErrorMessage(lineNumber, "Korrupt expression!");
            return(false);
        }