Example #1
0
        /// <summary>
        /// Check that a variable declared in the root of a BaZic program is and only is an expression that contains only primitive values.
        /// </summary>
        /// <param name="expression">The expression to check,</param>
        private void ValidateGlobalVariableDeclarationDefaultValue(AbstractSyntaxTree.Expression expression)
        {
            if (expression == null)
            {
                return;
            }

            switch (expression)
            {
            case ArrayCreationExpression arrayCreation:
                foreach (var value in arrayCreation.Values)
                {
                    ValidateGlobalVariableDeclarationDefaultValue(value);
                }
                break;

            case ArrayIndexerExpression arrayIndexer:
                ValidateGlobalVariableDeclarationDefaultValue(arrayIndexer.TargetObject);
                break;

            case BinaryOperatorExpression binaryOperator:
                ValidateGlobalVariableDeclarationDefaultValue(binaryOperator.LeftExpression);
                ValidateGlobalVariableDeclarationDefaultValue(binaryOperator.RightExpression);
                break;

            case NotOperatorExpression notOperator:
                ValidateGlobalVariableDeclarationDefaultValue(notOperator.Expression);
                break;

            case PrimitiveExpression primitive:
                // It's OK.
                break;

            default:
                AddIssue(new BaZicParserException(expression.Line, expression.Column, expression.StartOffset, expression.NodeLength, L.BaZic.Parser.VariableDefaultValue));
                break;
            }
        }
Example #2
0
        /// <summary>
        /// Valudate a given expression.
        /// </summary>
        /// <param name="expression">The expression to analyze.</param>
        private void AnalyzeExpression(AbstractSyntaxTree.Expression expression)
        {
            if (expression == null)
            {
                return;
            }

            switch (expression)
            {
            case ArrayIndexerExpression arrayIndexer:
                ValidateArrayIndexerExpression(arrayIndexer);
                break;

            case ClassReferenceExpression classReference:
                break;

            case PropertyReferenceExpression propertyReference:
                AnalyzeExpression(propertyReference.TargetObject);
                break;

            case VariableReferenceExpression variableReference:
                ValidateVariableReferenceExpression(variableReference);
                break;

            case ExceptionReferenceExpression exception:
                break;

            case InvokeCoreMethodExpression invokeCoreMethod:
                ValidateCoreMethodInvocation(invokeCoreMethod);
                break;

            case InvokeMethodExpression invokeMethod:
                break;

            case PrimitiveExpression primitive:
                break;

            case BinaryOperatorExpression binaryOperator:
                AnalyzeExpression(binaryOperator.LeftExpression);
                AnalyzeExpression(binaryOperator.RightExpression);
                break;

            case NotOperatorExpression notOperator:
                AnalyzeExpression(notOperator.Expression);
                break;

            case InstantiateExpression instantiate:
                foreach (var value in instantiate.Arguments)
                {
                    AnalyzeExpression(value);
                }
                break;

            case ArrayCreationExpression arrayCreation:
                foreach (var value in arrayCreation.Values)
                {
                    AnalyzeExpression(value);
                }
                break;

            default:
                throw new NotImplementedException(L.BaZic.Parser.FormattedNoExpressionAnalyzer(expression.GetType().FullName));
            }
        }