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; }