Пример #1
0
        private void SemanticCheck(AssignStatement ast, CompilerContext context)
        {
            var valType   = expressionTyper.TypeExpression(ast.Value, context);
            var varExists = context.VariableExists(ast.VariableName);

            //ast.CompilerScope = context.CurrentScope;
            if (varExists)
            {
                var varType = context.GetVariableType(ast.VariableName);
                if (varType != valType)
                {
                    throw new TypingException($"bad assignment : {valType} expecting {varType}");
                }
            }
            else
            {
                var creation = context.SetVariableType(ast.VariableName, valType);
                ast.IsVariableCreation = creation;
                ast.CompilerScope      = context.CurrentScope;
            }
        }
        public WhileType TypeExpression(Expression expr, CompilerContext context)
        {
            if (expr is BoolConstant b)
            {
                return(TypeExpression(b, context));
            }
            if (expr is IntegerConstant i)
            {
                return(TypeExpression(i, context));
            }
            if (expr is StringConstant s)
            {
                return(TypeExpression(s, context));
            }
            if (expr is BinaryOperation binary)
            {
                return(TypeExpression(binary, context));
            }
            if (expr is Neg neg)
            {
                return(TypeExpression(neg, context));
            }
            if (expr is Not not)
            {
                return(TypeExpression(not, context));
            }
            if (expr is Variable variable)
            {
                var varType = context.GetVariableType(variable.Name);
                if (varType == WhileType.NONE)
                {
                    throw new TypingException($" variable {variable.Name} {variable.Position} is not intialized");
                }
                variable.CompilerScope = context.CurrentScope;
                return(varType);
            }

            throw new SignatureException($"unknow expression type ({expr.GetType().Name})");
        }