Ejemplo n.º 1
0
        public override void CheckSemantics(TigerScope scope, Report report)
        {
            ContainingScope = scope;

            //Check children
            LValueNode.CheckSemantics(scope, report);
            ExpressionNode.CheckSemantics(scope, report);

            if (!LValueNode.IsOK || !ExpressionNode.IsOK)
            {
                return;
            }

            //Check children types
            if (!LValueNode.TigerType.Assignable(ExpressionNode.TigerType))
            {
                report.AddError(SemanticErrors.InvalidAssignType(ExpressionNode, ExpressionNode.TigerType, LValueNode.TigerType));
            }

            var variableAccess = LValueNode as VariableAccessNode;

            if (variableAccess != null && !variableAccess.VariableInfo.Assignable)
            {
                report.AddError(SemanticErrors.NonAssignableVariable(LValueNode, variableAccess.VariableInfo.Name));
            }

            IsOK = true;
        }